ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM第九篇(GC调优)

2021-11-13 11:59:13  阅读:141  来源: 互联网

标签:内存大小 新生代 调优 GC 内存 JVM 垃圾


GC调优
做GC调优,首先确定垃圾回收器,是选择低延迟的还是高吞吐量的回收器。
低延时的 CMS,G1,ZGC
高吞吐量的 ParallelGC

最快的 GC,是不发生 GC:
首先要考虑自己的代码,避免频繁发生GC。
考虑以下几点:

  1. 数据是不是太多?
  2. 数据表示是否太臃肿?
  3. 是否存在内存泄漏?

然后再考虑GC调优问题。

新生代调优:
新生代的特点

  1. 所有的 new 操作的内存分配非常廉价
  2. 每个线程都会在伊甸园中分配一个私有的区域TLAB(thread-local allocation buffer),避免多个线程同时创建对象,产生干扰。
  3. 死亡对象的回收代价是零
  4. 大部分对象用过即死
  5. Minor GC 的时间远远低于 Full GC

新生代内存大小的设置:
如果新生代内存过小,则会更密集的进行GC操作,影响程序的吞吐量。
如果新生代内存过大,则在单次GC操作中,时间会变慢,新生代内存设置过大,会导致老年代内存过小,引发Full GC。
因此,设置合适新生代内存大小,会对程序的吞吐量产生重要的影响。Oracle官方建议,将新生代内存大小设置为堆内存大小的 25%到 50% 之间。在新生代的GC中采用的是 标记复制算法,分为两个阶段,标记和复制,其中复制阶段占绝大部分时间。
理想的新生代内存大小为:【并发量 * (请求响应所占用的内存空间大小)】

幸存区的内存大小:要能保留【当前活跃对象+需要晋升对象】
如果幸存区空间过小,JVM会动态的调整晋升阈值,将没有达到寿命的对象存入老年代。
晋升阈值配置得当,让长时间存活对象尽快晋升
-XX:MaxTenuringThreshold=threshold (设置晋升阈值,达到后晋升入老年代)

老年代调优
以CMS为例,老年代的内存越大越好。
CMS在垃圾回收时,与用户线程并行运行,在进行垃圾回收时,用户线程会产生新的垃圾,称为浮动垃圾。如果浮动垃圾产生速度过快,来不及回收,那么将会导致CMS并发失败,进行Full GC,将会退化为 SerialOld,串行的老年代的垃圾回收器,效率就会变得特别低。
如果频繁发生Full GC,可以将老年代的内存调大一些(1/4 到 1/3 )。
-XX:CMSInitiatingOccupancyFraction=percent(设置老年代内存占比的值,达到这个值,将会进行垃圾回收),设置的时候要考虑为浮动垃圾预留出足够的内存,一般值设置为 75%-80%。

标签:内存大小,新生代,调优,GC,内存,JVM,垃圾
来源: https://blog.csdn.net/weixin_40540957/article/details/121301223

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有