图灵学院 java高级架构师教程-64位操作系统如何进行JVM调优?
我们知道,如果JVM中的堆内存太小,则会频繁发生垃圾回收,并且垃圾回收将伴随不同程度的程序暂停。因此,如果扩展堆内存,则可以减少垃圾回收的频率,从而避免程序暂停。
因此,人们自然会想到扩展存储容量。从理论上讲,一个32位操作系统最多只能支持4G内存,而一个64位操作系统最多可以支持128G内存。因此,我们可以使用64位操作系统,使用64位JVM,并为JVM分配更大的堆内存。但是问题也随之而来。
在堆内存变大之后,尽管减少了垃圾回收的频率,但是每次垃圾回收的时间却变长了。如果内存为14G,则每个FullGC将持续数十秒。如果FullGC频繁发生,则对于网站来说是无法忍受的。
因此,对于使用大内存的程序来说,一定要减少FullGC的频率,如果每天只有一两次FullGC,而且发生在半夜,那完全可以接受。
要减少FullGC的频率,就要尽量避免太多对象进入老年代,可以有以下做法:
确保对象都是“朝生夕死”的
一个对象使用完后应尽快让他失效,然后尽快在新生代中被MinorGC回收掉,尽量避免对象在新生代中停留太长时间。
提高大对象直接进入老年代的门槛
通过设置参数-XX:PretrnureSizeThreshold来增加大对象的阈值,请尝试让这些对象先进入年轻一代,然后由MinorGC尽快回收,而不是直接进入旧一代。
注意:使用64位JDK的注意点
64位JDK支持更大的堆内存,但更大的堆内存会导致一次垃圾回收时间过长。
现阶段,64位JDK的性能普遍比32位JDK低。
堆内存过大无法在发生内存溢出时生成内存快照
若将堆内存设为10G,那么当堆内存溢出时就要生成10G的大文件,这基本上是不可能的。
相同程序,64位JDK要比32位JDK消耗更大的内存