调整JVM(GC)以实现高响应的服务器应用程序

rnd*_*gen 8 java performance garbage-collection jvm

我在Linux 64bit上运行一个具有8个核心CPU和6 GB内存的应用程序服务器.

服务器必须具有高响应性.

经过一番检查后,我发现在服务器上运行的应用程序创建了相当多的短期对象,并且只有大约200~400 MB的长寿命对象(只要没有内存泄漏)

阅读http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html后, 我使用这些JVM选项

-server -Xms2g -Xmx2g -XX:MaxPermSize=256m -XX:NewRatio=1 -XX:+UseConcMarkSweepGC
Run Code Online (Sandbox Code Playgroud)

结果:次要GC需要0.01~0.02秒,主要GC需要1~3秒,小GC不断发生.

如何进一步改进或调整JVM?

堆大小?但GC需要更多时间吗?

更大的NewSize和MaxNewSize(适合年轻一代)?

其他收藏家?并行GC?

让主要GC更频繁地进行是一个好主意吗?如何?

Ste*_*n C 8

结果:次要GC需要0.01~0.02秒,主要GC需要1~3秒,小GC不断发生.

除非您报告暂停,否则我会说CMS收集器正在执行您要求它执行的操作.根据定义,CMS将使用比串行和并行收集器更大的CPU百分比.这是您为低暂停时间支付的罚金.

如果你看到1到3秒的暂停时间,我会说你需要做一些调整.我不是专家,但看起来你应该从减少CMSInitiatingOccupancyFraction默认值92 的值开始.

增加堆大小将提高GC的"吞吐量".但是,如果您的问题是长时间暂停,增加堆大小可能会使问题变得更糟.