
斯科特·奥克斯
本书从JVM和JavaAPI两个方面,深入地介绍了Java8和Java11等新的Java长期支持版本中影响性能的因素。本书先从Java应用程序的通用方法、基准测试的缺陷、性能监控工具等方面,分析了如何通过JVM的配置方式影响程序的性能;接着从即时编译、垃圾回收、堆内存与原生内存最佳实践、线程与同步的性能等方面,分析了常见的优化方向及其特性。第2版专注于更加成熟的Java8和Java11,主要的更新内容涉及G1垃圾回收器和Java飞行记录器,以及Java在容器化环境下的性能变化。
关于这个例子中的典型用法,有一件有趣的事情。在每次调用calc()方法时,使用匿名类的代码都会创建一个新的对象。如果该方法被调用的次数很多(在测量其性能的基准测试中必须如此),那么该匿名类的大量实例会被快速创建并丢弃。正如你在第5章中看到的那样,这种用法往往对性能影响不大。分配对象(和更重要的初始化对象)的成本非常低,而且它们会被快速地丢弃,所以它们并不会真正地减慢垃圾回收器的速度。然而,当在纳秒范围内进行测量时,这些微小的时间会累加起来。 表中的最后一行使用了提前构造的对象,而不是匿名类: private IntegerInterface a1 = new IntegerInterface() { public int getInt() { return 1; } }; // ……其他接口也是如此…… public void calc() { return a1.get() + a2.get() + a3.get(); } 而Lambda的典型用法并不会在循环的每次迭代中创建新的对象,在某些边界情况下,这有利于其性能。不过,即便在这个例子中,这种差异也非常小。 Lambda和匿名类加载 此差异会显现出来的一种边界情况,发生在启动和类加载的过程中。在看到Lambda的代码时,你可能会认为,它是创建匿名类的语法糖。但这并不是它的工作原理,Lambda的代码会创建一个静态方法,该方法通过一个特殊的帮助类来调用。匿名类是真正的Java类,它有单独的类文件,并会通过类加载器加载。 正如你在本章前几节看到的那样,类加载的性能很重要,特别是在类路径很长的时候。所以,启动有很多匿名类(相对于有很多Lambda)的应用程序,可能会出现比这里更大的差异。 快速小结 ·使用Lambda还是匿名类,具体选择应当由编程的方便程度来决定,因为它们的性能几乎没有区别。 ·Lambda并不是通过匿名类实现的,所以上一条有一个例外情况,即在类加载很重要的环境中,Lambda会稍快一些。
提到很多知识,在别的地方了解不到,算是有深度也有广度,有点不好的就是只有部分章节写的很详细和系统
内容详实,垃圾回收那部分讲的比较细。
还不错。看技术书籍,最好看老外写的,最好看经典的
翻译的读起来有点吃力,没有第一版翻译的好,比如过早优化那节:第二版的翻译是"大部分时间里,比如在97%的时间里,我们不应该对细枝末节进行优化",第一版的翻译是"不要把大量的时间耗费在微小的性能提升上"
书籍挺好,对性能优化的几个方面进行了切入,从系统级底层到JVM到JDK,逐步完善解释优化点,但正如作者所说,性能优化不仅仅是技术操作更兼具艺术处理的范畴,这在某种程度上反而使性能优化的工作平添许多探索真相的美感。
非常不错的一本书,我还会读第二遍
比较适合刚刚学java不久的人吧,大部分观点在深入理解java虚拟机里面有,而且更全.
对垃圾回收调优讲解比较细 可用于线上性能优化参考