美文网首页
ITEM 66: 使用 native 方法时要慎重

ITEM 66: 使用 native 方法时要慎重

作者: rabbittttt | 来源:发表于2020-01-30 14:50 被阅读0次

ITEM 66: USE NATIVE METHODS JUDICIOUSLY
  Java本机接口 (JNI) 允许 Java 程序调用本机方法,这些方法是用 C 或 C++ 等本机编程语言编写的。从历史上看,原生方法主要有三种用途。它们提供对特定于平台的设施(如注册中心)的访问。它们提供对现有本机代码库的访问,包括提供对遗留数据访问的遗留库。最后,使用本机方法以本机语言编写应用程序的性能关键部分,以提高性能。
  使用本机方法来访问特定于平台的工具是合法的,但是很少有必要:随着Java平台的成熟,它提供了对许多以前只能在主机平台上找到的特性的访问。例如,在 Java 9 中添加的流程 API 提供了对 OS 流程的访问。当 Java 中没有等价的库可用时,使用本机方法来使用本机库也是合法的。
  为了提高性能,很少建议使用本机方法。在早期的版本中(Java 3之 前),这通常是必要的,但是从那时起,JVM 变得更快了。对于大多数任务,现在可以在 Java 中获得类似的性能。例如,当 java.math 在版本1.1中,BigInteger 依赖于用 C 编写的当时快速的多精度算术库。在Java 3中,BigInteger 在 Java 中重新实现,并经过仔细调整,使其运行速度快于原始的本机实现。
  这个故事的一个可悲的结尾是,除了 Java 8 中大数的更快乘法之外,BigInteger 此后几乎没有变化。在此期间,在本机库方面的工作继续快速进行,尤其是 GNU 多精度算术库(GMP)。需要真正高性能多精度算法的 Java 程序员现在可以通过本机方法使用 GMP [Blum14]。
  使用本机方法有严重的缺点。由于本机语言不安全(item 50),使用本机方法的应用程序不再对内存损坏错误免疫。由于本机语言比 Java 更依赖于平台,因此使用本机方法的程序可移植性较差。它们也更难调试。如果不小心,本机方法可能会降低性能,因为垃圾收集器无法自动化甚至跟踪本机内存使用(item 8),而且与进出本机代码相关的成本。最后,本机方法需要“胶水代码”,读起来很困难,写起来也很繁琐。
  总之,在使用本机方法之前要三思。您很少需要使用它们来提高性能。如果必须使用本机方法来访问底层资源或本机库,则应尽可能少地使用本机代码,并对其进行彻底测试。本机代码中的一个错误就可以破坏整个应用程序。

相关文章

网友评论

      本文标题:ITEM 66: 使用 native 方法时要慎重

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