美文网首页
Effective Java(3rd)-Item66 谨慎使用n

Effective Java(3rd)-Item66 谨慎使用n

作者: 难以置信的优雅 | 来源:发表于2018-09-18 15:06 被阅读0次

      Java Native Interface(JNI)允许Java程序调用 native方法。它们是用C或c++等本机编程语言编写的方法。从历史上看,原生方法主要有三种用途。它们提供对特定于平台的设施(如注册中心)的访问。它们提供对现有本机代码库的访问,包括提供对遗留数据访问的遗留库。最后,使用本机方法用本机语言编写应用程序的性能关键部分,以提高性能。
      使用本机方法访问特定于平台的设施是合法的,但是很少有必要:随着Java平台的成熟,它提供了对许多以前只能在主机平台中找到的特性的访问。例如,Java 9中添加的流程API提供了对OS流程的访问。在Java中没有等效库时,使用本机方法来使用本机库也是合法的。
      很少建议使用本机方法来提高性能。在早期版本(Java 3之前)中,这通常是必要的,但是从那时起jvm变得更快了。对于大多数任务,现在可以在Java中获得类似的性能。例如,当在1.1版中添加了java.math,BigInteger依赖于用C语言编写的当时快速的多精度算术库。在Java 3中,BigInteger在Java中得到了重新实现,并进行了仔细的调优,使其运行速度快于原始的本机实现。
      这个故事的一个可悲的结尾是,除了在Java 8中对大数进行更快的乘法运算之外,BigInteger此后几乎没有发生什么变化。在本机库上的工作仍在继续,尤其是GNU多精度算术库(GMP)。。需要真正高性能多精度算法的Java程序员现在可以通过本机方法使用GMP [Blum14]。
      使用本机方法有严重的缺点。由于本机语言不安全(item50),使用本机方法的应用程序不再对内存损坏错误免疫。由于本机语言比Java更依赖于平台,因此使用本机方法的程序的可移植性较差。它们也更难调试。如果不小心,本机方法可能会降低性能,因为垃圾收集器无法自动跟踪本机内存使用情况( item8 ),而且进出本机代码会产生相关的成本。最后,原生方法需要“粘合代码”,这很难读,而且编写起来很乏味。

      总之,在使用本机方法之前要三思。您很少需要使用它们来提高性能。如果必须使用本机方法来访问底层资源或本机库,请尽可能少地使用本机代码,并对其进行彻底的测试。本机代码中的一个错误就可以破坏整个应用程序。
    本文写于2019.7.19,历时1天

    相关文章

      网友评论

          本文标题:Effective Java(3rd)-Item66 谨慎使用n

          本文链接:https://www.haomeiwen.com/subject/ritpnftx.html