说起JVM调优可能很多Java工程师会感到困惑吧。例如,当我们被面试官问起垃圾回收的相关问题时,内心容易泛起恐惧。其实,这些问题是因为我们没有看系统性讲解GC的权威文档(Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide),只看一些组织得有些混乱的(把人讲晕)"深入理解Java虚拟机"书(入门或许还可以),或者从网上看一些比较零碎的博客,这种学习方式造成的。
正如本文标题"如何正确学会Java虚拟机调优"所言,本文就是要帮助你快速掌握JVM虚拟机垃圾回收,即先看一些JVM基础知识(包括那本名为“深入理解”实为入门级的JVM书),然后再看官方文档,辅助的看本公众号文章,并且一定要多实践练习。详细掌握务必看完Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide(虽然目录有点长,其实内容并不庞大,很快就能看完)。
顺便说下,学会JVM的垃圾收集需要先了解JVM的内存布局。否则,会看不懂GC教程在说些什么。至少要知道JVM的堆内存为什么要区分为Young Generation和Tenured Generation。这是本人遇到的一个面试问题,答案:有的对象存活时间长,有的对象存活时间短,对它们分别用不用的垃圾回收算法可以提高效率。如果全部放在一起,那么当一个程序中有大量对象的时候,把可回收对象找出来将会消耗特别长的时间。
要让Java后台服务器JVM的运行性能最大化,要调整三个因素:GC、堆大小、Runtime编译器。HotSpot自带一个Ergonomics模块,让你无需配置GC、堆大小、Runtime编译器,而会根据运行环境,自动选择: 1) 使用哪个GC;2) 堆大小设置成多大; 3)选用server模式的Runtime编译器还是client模式的编译器。Ergonomics模块根据你的cpu个数是否大于等于2,物理内存大小是否大于2GB,来判断当前机器是否作为服务器。如果是服务器,那么
GC就会选用Parallel收集器(Parallel收集器介绍)
初始堆大小为1/64的物理内存~1GB,最大堆大小:1/4物理内存~1GB
选用Server模式的Runtime编译器
JVM根据运行环境启用的默认值未必适合你的程序,这时候就需要手动调整堆大小,手动选择GC。可以参考之前所写的介绍GC的文章(比官方文档多给出了一些信息):
1. 一文就懂Java虚拟机的CMS收集器原理及使用(关于CMS收集器)
2. 一文立即学会Java虚拟机调优,从此BAT技术面试无忧(关于Parallel收集器)
网友评论