适用于4GB JVM和3GB缓存的JVM/GC调优

Mat*_*oli 7 java optimization garbage-collection jvm jvm-arguments

我正在寻找适当的设置来配置Web应用程序的JVM .我已经阅读过关于old/young/perm生成的内容,但是我最好在这个配置中使用这些参数.

在4 GB中,大约3 GB用于缓存(使用EhCache的应用缓存),因此我正在寻找最佳设置.仅供参考,缓存在应用程序的生命周期内是静态的(从磁盘加载,永不过期),但使用频繁.

我已经分析了我的应用程序,并且我已经对数据库查询,应用程序的体系结构,缓存大小等进行了优化...... 我只是在这里寻找JVM配置建议.我已经测量了垃圾收集器99%的吞吐量,并且当Full GC运行时大约6-8s暂停(大约每1/2h一次).

以下是当前的JVM参数:

-XX:+UseParallelGC -XX:+AggressiveHeap -Xms2048m -Xmx4096m
-XX:NewSize=64m -XX:PermSize=64m -XX:MaxPermSize=512m
-verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log
Run Code Online (Sandbox Code Playgroud)

这些参数可能完全关闭,因为它们很久以前就被写过了......在应用程序变得那么大之前.

我使用Java 1.5 64位.

你看到任何可能的改进吗?

编辑:机器有4个核心.

Pau*_*aft 5

-XX:+ UseParallel*Old*GC应该可以加速多核机器上的Full GC.

您还可以使用不同的NewRatio值进行分析.您的缓存对象将存在于tenured generation中,因此使用-XX:NewRatio = 7对其进行分析,然后再使用一些更高和更低的值进行分析.

您可能无法在分析过程中准确复制实际使用,因此请确保在实际使用中监视GC,然后您可以进行微小更改(例如,幸存者空间等)并查看它们具有的效果.

老建议不是将AggressiveHeap与Xms和Xmx一起使用,我不确定是否仍然如此.

编辑:请告诉我们您部署的操作系统/硬件平台.

每30分钟收集一次,表明老一代人已经满员.newRatio的高价值将为年轻人带来更多空间.你能给JVM超过4克还是仅限于此?

知道您的目标/非功能要求是什么也是有用的.您是否希望避免这些6/7秒暂停而存在较低吞吐量的风险,或者是否为可能的最高吞吐量暂停可接受的折衷?

如果要最小化暂停,请通过删除两者来尝试CMS收集器

-XX:+UseParallelGC -XX:+UseParallelOldGC 
Run Code Online (Sandbox Code Playgroud)

并添加

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
Run Code Online (Sandbox Code Playgroud)

使用各种NewRatio值的配置文件,看看你如何继续.

CMS收集器的一个缺点是,与并行的旧的和串行的收集器不同,它不会压缩老一代.如果旧一代变得过于分散并且次要集合需要同时向旧版本推销大量对象,则可能会调用完整的序列集合,这可能意味着长时间停顿.(我曾经在prod中看到过这种情况,但IBM JVM内存不足而不是调用压缩集合!)

这对您来说可能不是问题 - 这取决于应用程序的性质 - 但您可以通过每晚或每周重新启动来保证它.