使用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

回到顶部