JavaGarbageCollectio
GC优化及配置
通过对GC理论部分的学习已经对JVMGC有了比较全面的了解,已经了解了GC的几种类型已经工作流程。本节主要从实践角度分门别类的了解GC的各方面信息。
在HotSpotJVM中有三种概念,分别代表了不同代中发生的GC动作。Mi
orGC:指发生在新生代的垃圾收集动作,由于新生代中对象生命周期较短,更新速度迅速,所以Mi
orGC也会比较频繁,Mi
orGC的回收速度也比较快。Mi
orGC通常使用copyi
g算法,此算法一般为最有效的。MajorGC:指发生在老年代或永久代的垃圾收集动作,出现了MajorGC,通常会伴随至少一次的比比较慢。FullGC:指对堆内存整体进行垃圾收集包含新生代,老年代,永久代,有时可以理解为仅是MajorGC,又可以理解为MajorGCMi
orGC,因为概念理解上的差异我们理解FullGC为清理所有内存即可。Mi
orGC但有的收集策略会只有MajorGC。MajorGC的速度一般会
下面是内存及GC的相关参数:
内存相关设置32位系统Heap最大支持2GB,64位以上无限制Xms:初始堆Heap大小,默认3670k。当空闲堆内存小于40时,JVM就会增大堆内存直到Xmx所设置的最大值,可以通过XXMi
HeapFreeRatio
设置其比例。Xmx:最大堆Heap大小,默认64m。当空闲堆内存大于70时,JVM会减少堆内存直到Xms所设置的最小值,可以通过XXMaxHeapFreeRatio
设置其比例。Xm
:新生代大小,增大新生代后会相应减小老年代大小。此值对系统性能影响较大,Java官方推荐配置为整个堆大小的38。Xss:设置每个线程栈的大小。Java15以后每个线程栈默认大小为1M,之前每个线程栈默认大小为256K。可以根据应用的线程所需内存大小进行调整。一般情况下默认值已经能满足绝大部分情景的应用,如果想更进一步优化则需要非常细致的测试。在相同物理内存下,减小这个值能生成更多的线程,进程中可容纳线程数量与很多因素有关,感兴趣的可以详细了解下,据说可以达到6500个以上。XXMi
HeapFreeRatio40:如果发现空闲堆内存占到整个预估上限值的40,则增大上限值。
fXXMaxHeapFreeRatio70:如果发现空闲堆内存占到整个预估上限值的70,则收缩预估上限值。XXNewRatio2:设置年轻代和老年代的比值。例如:
3,则表示年轻代与老年代比值为13,年轻代占整个年轻代与老年代之和的14。XXSurvivorRatio8:Ede
与Survivor的占用比例。例如8表示,一个survivor区占用18的Ede
内存,即110的新生代内存,此处需注意年轻代有2个survivor区,所以比例为110。XXTargetSurvivorRatio50:实际使用的survivor空间大小占比。r