天天看点

JVM 优化思路

尽量避免 Full GC

Full GC 的成本远高于 Mirror GC 因此某些情况下,尽量让对象进入新生代,虽然大部分情况下,JVM 会尝试在 Eden 区分配对象,但是由于空间紧张,新生代的数据会提前进入老年代。因此最大限度的避免新对象直接进入老年代。

大对象进入老年代

大对象出现在年轻代很可能扰乱年轻代GC,并破坏年轻代原有的对象结构。在年轻代分配大对象,很可能导致空间不足,为了足够的空间容纳大对象,JVM 不得不将年轻代中的年轻对象放到年老代。因为大对象占用空间多,很可能需要移动大量小的年轻对象进入年老代。XX:PetenureSizeThreshold 设置大对象直接进入年老代的阀值。

设置新生代进入老年代年龄

堆中的每个对象都有自己的年龄,一般情况下,年轻代的对象放在年轻代,年老对象放在年老代,为了做到这点,虚拟机为每个对象维护一个年龄。Eden 区,景观一次GC 之后移动到 Survivor 区对象年龄+1,以后每经历一次GC ,年龄+1,XX:MaxTenuringThreshold  默认值为15 ,但是不意味着每个对象都要达到这个年龄才能进入老年代。

稳定堆大小

稳定的堆大小对垃圾回收是有利的,一般是设置  -Xms 和 Xms 的大小一致,即最大堆和最小堆一致。稳定的堆空间可以减少 GC 的次数,但是同时也增加了每次 GC 的时间。有个办法,可以让堆在一个区间中震荡,在系统中不需要大内存时,压缩堆空间,可以加快单次GC 的速度。

-XX:MinHeapFreeRatio 参数用来设置堆空间最小空闲比例,默认值是 40。当堆空间的空闲内存小于这个数值时,JVM 便会扩展堆空间。-XX:MaxHeapFreeRatio 参数用来设置堆空间最大空闲比例,默认值是 70。当堆空间的空闲内存大于这个数值时,便会压缩堆空间,得到一个较小的堆。当-Xmx 和-Xms 相等时,-XX:MinHeapFreeRatio 和-XX:MaxHeapFreeRatio 两个参数无效。

增大吞吐提升系统性能

增大吞吐提升系统性能,吞吐量有限方案将会减少系统执行垃圾回收的总时间。故可以考虑提高吞吐量的并行回收器,

java –Xmx3800m –Xms3800m –Xmn2G –Xss128k –XX:+UseParallelGC 
   –XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC

Xmx3800m –Xms3800m:设置 Java 堆的最大值和初始值。一般情况下,为了避免堆内存的频繁震荡,导致系统性能下降,我们的做法是设置最大堆等于最小堆。假设这里把最小堆减少为最大堆的一半,即 1900m,那么 JVM 会尽可能在 1900MB 堆空间中运行,如果这样,发生 GC 的可能性就会比较高;

-Xss128k:减少线程栈的大小,这样可以使剩余的系统内存支持更多的线程;

-Xmn2g:设置年轻代区域大小为 2GB;

–XX:+UseParallelGC:年轻代使用并行垃圾回收收集器。这是一个关注吞吐量的收集器,可以尽可能地减少 GC 时间。

–XX:ParallelGC-Threads:设置用于垃圾回收的线程数,通常情况下,可以设置和 CPU 数量相等。但在 CPU 数量比较多的情况下,设置相对较小的数值也是合理的;

–XX:+UseParallelOldGC:设置年老代使用并行回收收集器
           

使用非占有的垃圾回收器

java –Xmx3550m –Xms3550m –Xmn2g –Xss128k –XX:ParallelGCThreads=20
 –XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=90
 –XX:MaxTenuringThreshold=31
–XX:ParallelGCThreads=20:设置 20 个线程进行垃圾回收;

–XX:+UseParNewGC:年轻代使用并行回收器;

–XX:+UseConcMarkSweepGC:年老代使用 CMS 收集器降低停顿;

–XX:+SurvivorRatio:设置 Eden 区和 Survivor 区的比例为 8:1。稍大的 Survivor 空间可以提高在年轻代回收生命周期较短的对象的可能性,如果 Survivor 不够大,一些短命的对象可能直接进入年老代,这对系统来说是不利的。

–XX:TargetSurvivorRatio=90:设置 Survivor 区的可使用率。这里设置为 90%,则允许 90%的 Survivor 空间被使用。默认值是 50%。故该设置提高了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。因此,这个选项更有助于将对象留在年轻代。

–XX:MaxTenuringThreshold:设置年轻对象晋升到年老代的年龄。默认值是 15 次,即对象经过 15 次 Minor GC 依然存活,则进入年老代。这里设置为 31,目的是让对象尽可能地保存在年轻代区域。
           

https://mp.weixin.qq.com/s/5bhO0hKh9IBJLdoTZySFjA