JVM新生代和老年代的参数——一次ElasticSearch的jvm参数调整

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yx0628/article/details/79946056

在测试服务器上发现 ES 进程总是挂掉,于是看 ES 的 gc 情况:
先查到进程的 PID 号,然后使用 jstat 指令:

jstat -gc PID 5000

5000 是毫秒,每 5 秒刷新一次打印。

查看日志如下:
调整参数前

可以看到经过一段时间的观察,新生代的 YoungGC 并没有发生,一直是 18 次没改变,而 FullGC 在新生代内存用完时就会出现一次,非常的频繁。
原因很明显,年老代的内存大小只有 512K 字节,特别小,导致老年代一直处于没有剩余空间的状态,所以每次的 GC 都会触发 FullGC 。

之前的内存没有设置新生代和老年代的比例,导致 16G 内存完全分给了新生代,其中 Eden 区 12G,survivor1 和 survivor2 各 2G 左右大小。

调整时,加入新老生代的内存比例即可。

-XX:NewRatio=8

这里由于 ES 检索时,内存中会缓存许多检索记录的结果,而且空间会特别大,所以就将老年代设置大一些,老年代/新生代=8,这样更多的记录能够被缓存下来,提高 ES 的检索效率。

参数改变后,总共分配 12G 的内存,老年代 9G ,新生代 1G 多,Eden大约 1G,survivor1 和 survivor2 大约各 100M 大小。
更改后日志如下:
根据日志可以看到,YoungGC 经常在执行,而 FullGC 由于老年代使用量比较小,频率会很低,达到了预期的目标。

调整参数后
调整参数后2

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页