使用UseConcMarkSweepGC减少JVM暂停时间> 1秒
我正在具有16Gb RAM,8核处理器和Java 1.6的计算机上运行内存密集型应用程序,这些计算机均在CentOS
5.2版(最终版)上运行。确切的JVM详细信息是:
java version "1.6.0_10"Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
我正在使用以下命令行选项启动该应用程序:
java -XX:+UseConcMarkSweepGC -verbose:gc -server -Xmx10g -Xms10g ...
我的应用程序公开了JSON-RPC
API,我的目标是在25毫秒内响应请求。不幸的是,我看到延迟可能超过1秒,这似乎是由垃圾回收引起的。以下是一些较长的示例:
[GC 4592788K->4462162K(10468736K), 1.3606660 secs][GC 5881547K->5768559K(10468736K), 1.2559860 secs]
[GC 6045823K->5914115K(10468736K), 1.3250050 secs]
这些垃圾收集事件中的每一个都伴随着延迟的API响应,该响应的持续时间与显示的垃圾收集时间非常相似(在几毫秒内)。
以下是一些典型示例(这些都是在几秒钟内生成的):
[GC 3373764K->3336654K(10468736K), 0.6677560 secs][GC 3472974K->3427592K(10468736K), 0.5059650 secs]
[GC 3563912K->3517273K(10468736K), 0.6844440 secs]
[GC 3622292K->3589011K(10468736K), 0.4528480 secs]
问题是我认为UseConcMarkSweepGC会避免这种情况,或者至少使其变得极为罕见。相反,几乎每分钟或更长的时间就会发生一次超过100ms的延迟(尽管超过1秒的延迟很少见,也许每10或15分钟一次)。
另一件事是,我认为只有FULL GC才会导致线程被暂停,但这些线程似乎不是完整的GC。
可能需要注意的是,大多数内存被使用软引用的LRU内存缓存占用。
任何帮助或建议,将不胜感激。
回答:
事实证明,堆的一部分已换出到磁盘上,因此垃圾回收必须将大量数据从磁盘上拉回到内存中。
我通过将Linux的“ swappiness”参数设置为0来解决此问题(这样它就不会将数据交换到磁盘上)。
以上是 使用UseConcMarkSweepGC减少JVM暂停时间> 1秒 的全部内容, 来源链接: utcz.com/qa/415248.html