Tips
书中的源代码地址: https://github.com/jbloch/effective-java-3e-source-code
注意, 书中的有些代码里方法是基于 Java 9 API 中的, 所以 JDK 最好下载 JDK 9 以上的版本.
Effective Java, Third Edition
66. 明智谨慎地使用本地方法
Java Native Interface(JNI)允许 Java 程序调用本地方法 (native methods), 这些方法是用本地编程语言(如 C 或 C ++) 编写的方法. 从历史上看, 本地方法有三个主要用途. 它们提供对特定于平台设备 (如注册表) 的访问. 它们提供对现有本地代码库的访问, 包括提供对遗留数据库的数据访问. 最后, 本地方法用于以本地语言编写应用程序的性能关键部分, 以提高性能.
现在已经不再建议使用本地方法来提高性能. 在早期版本 (Java 3 之前) 中, 它通常是必需的, 但从那时起 JVM 就变得更快了. 对于大多数任务, 现在可以在 Java 中获得可比较的性能. 例如, 当在 Java 版本 1.1 中添加 java.math 时, BigInteger 依赖于用 C 语言编写的一个快速多精度算术库. 在 Java 3 中, BigInteger 在 Java 中重新实现, 并仔细调整到比原始本地实现运行得更快的程度.
这个故事的一个可悲的结尾是, 除了在 Java 8 中对大数进行更快的乘法运算之外, BigInteger 此后几乎没有发生什么变化. 在此期间, 对本地类库的工作继续快速进行, 尤其是 GNU 多精度算术类库(GMP). 如果需要真正高性能多精度算法, Java 程序员现在可以通过本地方法使用 GMP [Blum14].
使用本地方法具有严重的缺点. 由于本地语言不安全(条目 50), 使用本地方法的应用程序不再免受内存损坏错误的影响. 由于本地语言比 Java 更依赖于平台, 因此使用本地方法的程序不太可移植. 它们也更难调试. 如果使用不当, 本地方法可能会降低性能, 因为垃圾收集器无法自动甚至跟踪本地内存使用情况(条目 8), 并且存在进入和退出本地代码相关的成本. 最后, 本地方法需要 "粘合代码", 难以阅读, 编写还繁琐.
总之, 在使用本地方法之前要三思而后行. 很少需要使用它们来提高性能. 如果必须使用本地方法来访问地城资源或本地类库, 请尽可能少地使用本地代码, 并对其进行彻底测试. 本地代码中的单个错误可能会破坏整个应用程序.
来源: http://www.jianshu.com/p/06412c130302