博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM 垃圾回收经验
阅读量:6882 次
发布时间:2019-06-27

本文共 3822 字,大约阅读时间需要 12 分钟。

hot3.png

优化经验:

  1. 年轻代选择。避免设置过小,当新生代设置过小时会导致,YGC次数更加频繁,可能导致YGC对象直接进入年老代,如果此时年老代满了,会容易触发Full GC;
  2. 年老代选择。年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数,如果堆设置小了,可以会造成内存碎片,高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间,最优化的方案,一般需要参考并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例;
  3. Xms和Xmx设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力;
  4. 较小堆引起的碎片问题,因为年老代的并发收集器使用标记清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象,但是当堆空间较小时,运行一段时间以后,就会出现”碎片",如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收,如果出现”碎片",可能需要进行如下配置:
    -XX:+UseCMSCompactAtFullCollection // 使用并发收集器时,开启对年老代的压缩
    -XX:CMSFullGCsBeforeCompaction=0 // 设置多少次Full GC后,对年老代进行压缩
  5. 使用CMS要注意初始标记和重新标记,因为这两个阶段是STW,一般在初始标记和重新标记前都会进行YGC,在重新标记前保证preclean下,保证重新标记不会太耗时。
     

优化配置:

-Xmx1024m-Xms1024m     // 将Xmx和Xms设置一样大,避免调整-Xmn384m      // 默认为堆的1/3,官方推荐为堆的3/8-XX:PermSize=128m-XX:MaxPermSize=128m                     // 将持久代设置一样带,避免调整-XX:+UseParNewGC                         // 年轻代使用并行gc-XX:+UseConcMarkSweepGC                  // 年老代使用并行gc-XX:CMSFullGCsBeforeCompaction=0         // 每次full gc之后,进行压缩-XX:CMSInitiatingOccupancyFraction=75    // 年老代占75进行full gc-XX:CMSMaxAbortablePrecleanTime=20000    // 延长preclean时间-XX:SurvivorRatio=6    // 增大Survivor的大小,避免年轻代过早进入年老代-XX:+PrintGCDetails    // 打印gc log-XX:+PrintGCDateStamps-XX:+PrintHeapAtGC​​​​​​​-Xloggc:root/gc.log

优化主要借鉴垃圾回收日志,主要查看YGC和FGC的频率和时长,如果YGC和FGC过于频繁可能是年轻代和Survivor区过小,CMS FGC一定要注意1和4两个两个阶段,这两个阶段是STW的,在初始标记前进行YGC和在重新标记前充分的preclean都可以提高效率。

Java HotSpot(TM) 64-Bit Server VM (25.111-b14) for linux-amd64 JRE (1.8.0_111-b14), built on Sep 22 2016 16:14:03 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)Memory: 4k page, physical 1016272k(621800k free), swap 0k(0k free)CommandLine flags: -XX:CMSFullGCsBeforeCompaction=0 -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=536870912 -XX:MaxNewSize=209715200 -XX:MaxTenuringThreshold=6 -XX:NewSize=209715200 -XX:OldPLABSize=16 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 2016-10-27T18:26:59.917+0800: 4.213: [GC (CMS Initial Mark) [1 CMS-initial-mark: 0K(319488K)] 88688K(503808K), 0.0456410 secs] [Times: user=0.04 sys=0.00, real=0.04 secs] 2016-10-27T18:26:59.967+0800: 4.262: [CMS-concurrent-mark-start]2016-10-27T18:26:59.969+0800: 4.264: [CMS-concurrent-mark: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2016-10-27T18:26:59.969+0800: 4.264: [CMS-concurrent-preclean-start]2016-10-27T18:26:59.970+0800: 4.266: [CMS-concurrent-preclean: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2016-10-27T18:26:59.970+0800: 4.266: [CMS-concurrent-abortable-preclean-start] CMS: abort preclean due to time 2016-10-27T18:27:05.035+0800: 9.330: [CMS-concurrent-abortable-preclean: 0.122/5.064 secs] [Times: user=3.12 sys=0.13, real=5.07 secs] 2016-10-27T18:27:05.035+0800: 9.330: [GC (CMS Final Remark) [YG occupancy: 157528 K (184320 K)]2016-10-27T18:27:05.035+0800: 9.330: [Rescan (parallel) , 0.0812074 secs]2016-10-27T18:27:05.116+0800: 9.412: [weak refs processing, 0.0000577 secs]2016-10-27T18:27:05.116+0800: 9.412: [class unloading, 0.0053644 secs]2016-10-27T18:27:05.122+0800: 9.417: [scrub symbol table, 0.0041047 secs]2016-10-27T18:27:05.126+0800: 9.421: [scrub string table, 0.0006452 secs][1 CMS-remark: 0K(319488K)] 157528K(503808K), 0.0925696 secs] [Times: user=0.09 sys=0.00, real=0.09 secs] 2016-10-27T18:27:05.128+0800: 9.423: [CMS-concurrent-sweep-start]2016-10-27T18:27:05.128+0800: 9.423: [CMS-concurrent-sweep: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 2016-10-27T18:27:05.128+0800: 9.423: [CMS-concurrent-reset-start]2016-10-27T18:27:05.130+0800: 9.425: [CMS-concurrent-reset: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

 

转载于:https://my.oschina.net/u/2950586/blog/776727

你可能感兴趣的文章
swagger配置即使用
查看>>
webrtc Codec生成相关
查看>>
Python加密—AES加密解密
查看>>
Ubuntu虚拟机无法连接到网络
查看>>
springboot 系列教程二:常用starter介绍
查看>>
根据用户ID获取权限的方法
查看>>
Linux 指令篇:使用者管理--sudo
查看>>
(八)Flask 学习 —— 关注者,联系人和好友
查看>>
自己写的一个简单的网盘demo
查看>>
php脚本处理无效图片
查看>>
WebService框架JWS、Axis2、XFire、CXF的区别
查看>>
AEAI Portal V3.5.2门户集成平台发版说明
查看>>
Nim编译和使用DLL
查看>>
IM,小视频, 直播 几大云平台对比选择
查看>>
Java调用Oracle的分页存储过程
查看>>
HTML5基础知识(1)---认识基本标记
查看>>
mysql
查看>>
修改max_allowed_packet(允许执行的sql最大长度)
查看>>
node js 处理时间分析
查看>>
判断数据库、表和字段是否存在
查看>>