首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

JVM调优记要

2013-09-26 
JVM调优记录??????? 前阵子写了一个RPC服务,测试的过程中,同时在测试的过程中反应间歇性超时比较严重,我的

JVM调优记录

??????? 前阵子写了一个RPC服务,测试的过程中,同时在测试的过程中反应间歇性超时比较严重,我的第一反应就是gc有问题,于是就观察了一阵子GC情况,发现这个服务的YGC时间有点不太正常,快的时候也就几十ms,慢的时候几十秒,总体上说就是快慢波动比较明显。

?

??????? 先说说这个服务,这个服务里面有个后台线程,每10分钟会去读一个大文件,然后将文件的数据缓存到本地,这个文件大概有100M不到,也就是说每10分钟,即使没有对外服务的情况下,也会有一次内存的加载过程,会产生一个内存波动。

?

??????? 为了查这个超时的问题,也恶补了一些JVM的相关知识,首先我的疑问是,YGC时间长会影响到服务超时?我之前一直以为YGC是不会stop the world的,只是copy。我试着在程序YGC的过程中,去访问这个服务,发现确实在长时间YGC的过程中,超时情况很严重,待YGC停止后,再访问服务,就很快响应了,所以事实摆在眼前,发现YGC的过程确实是有暂停服务的嫌疑,通过查看JVM参数,发现服务使用的CMS的GC方式,查阅相关的资料,得知CMS的YGC和并行GC的方式一样,stop-the-world + copy。确实是YGC时间过长导致服务超时比较严重,这样算是把超时问题的原因给定位了。

?

?????? 那究竟是什么原因导致YGC时间会很长呢,通过用jstat观察我发现一个问题,就是每次Eden区满的时候,一执行ygc survivor区几乎就直接100%了。我当时的感觉就是survivor区太小,eden区大?于是我试着调整了一下-XX:SurvivorRatio参数,默认这个值是8,也就是S0 :S1 :Eden之间的比例是1:1:8,我把这个比例改成了1:1:3,改完之后,通过一个晚上的观察,发现情况有所好转,但是这个问题还是存在,前几次YGC几乎都是很短时间就完成了,但是随着时间的积累,YGC时间过长的问题还是会出现。


?

?

?

?

????


?

1 楼 id.alex 2013-09-18   那么总结下来,如果是以下情况
1. 当内存中有一批较大的(相对来说)对象, 并且会在内存中停留一段时间,
2. XX:SurvivorRatio 较大时
容易触发 FGC.

因为 YGC 时 Survivor 不够大(原因情况2),并且有一些内存不能释放(原因情况1),会造成 Survivor 放不下, 直接放到 Tenured .

针对这中情况,尽量放大 Survivor .

感谢楼主分享.

2 楼 wensong 2013-09-18   id.alex 写道那么总结下来,如果是以下情况
1. 当内存中有一批较大的(相对来说)对象, 并且会在内存中停留一段时间,
2. XX:SurvivorRatio 较大时
容易触发 FGC.

因为 YGC 时 Survivor 不够大(原因情况2),并且有一些内存不能释放(原因情况1),会造成 Survivor 放不下, 直接放到 Tenured .

针对这中情况,尽量放大 Survivor .

感谢楼主分享.


说得很对,感谢总结 3 楼 lvwenwen 2013-09-18   那么总结下来,如果是以下情况

热点排行