JVM 优化思路

简介: 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:设置年老代使用并行回收收集器


使用非占有的垃圾回收器


为降低应用软件的垃圾回收器,回收考虑的是使用关注系统停顿的 CMS 回收器,其次为减少 FullGC 次数,应尽可能将对象停留在年轻代

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,目的是让对象尽可能地保存在年轻代区域。


相关文章
|
4月前
|
前端开发 Java 编译器
深入理解jvm - 编译优化(上)
深入理解jvm - 编译优化(上)
110 0
|
4月前
|
缓存 监控 算法
jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
153 0
|
4月前
|
存储 监控 安全
Java虚拟机的锁优化策略
Java虚拟机的锁优化策略
45 0
|
4月前
|
架构师 Java
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
jvm性能调优实战 - 35电商APP后台系统如何对Full GC进行深度优化
88 0
|
4月前
|
监控 数据可视化 Java
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
83 1
|
2月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
30 0
|
2月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
73 3
|
2月前
|
监控 Java 中间件
FGC频繁导致CPU 飙升定位及JVM配置优化总结
FGC频繁导致CPU 飙升定位及JVM配置优化总结
75 0
|
2月前
|
存储 设计模式 监控
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
Java面试题:简述JVM的内存结构,包括堆、栈、方法区等。栈内存优化的方法有 哪些?
34 0
|
3月前
|
监控 前端开发 Java
JVM系列9-后端编译与优化
JVM系列9-后端编译与优化
24 1