当前位置: 首页 > 面试题库 >

使用UseConcMarkSweepGC减少JVM暂停时间> 1秒

谭新知
2023-03-14
问题内容

我正在具有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来解决此问题(这样它就不会将数据交换到磁盘上)。



 类似资料:
  • 在使用apache Ignite2.6之后,我经常在JBoss的启动和停止上收到这样的警告。你能帮我知道是什么错误的配置会导致这些警告吗? 如果你需要更多的细节,请告诉我

  • 我运行jmeter脚本将近一周,今天观察到一件有趣的事情。以下是场景: 概述:我正在逐渐增加应用程序的负载。在上一次测试中,我给应用程序加载了100个用户,今天我将加载增加到150个用户。 150名用户测试结果: > 与上次测试相比,请求的响应时间减少了。(这是个好兆头) 吞吐量急剧下降到上一次测试的一半,负载更少。 我的问题是: > 当我的许多请求失败时,我得到了好的响应时间吗? 注:直到100

  • 我只想从中减去1个小时。我试着在Google上查找,发现有一个名为minus的方法,它获取日期的副本并在这里获取特定的持续时间:http://www.joda.org/joda-time/apidocs/org/joda/time/datetime.html#minus(long) 但我不知道如何使用它,我也找不到一个例子在互联网上。 下面是我的代码: 我还尝试将解析为double,这样就可以减去

  • 问题内容: 我正在以下Java版本上运行单线程Java应用程序: 启用该选项。仍然在启动应用程序时,使用监视系统时看到多个线程正在启​​动。我想尽可能减少启动的进程数,因为我有一个用例,其中涉及运行该应用程序的多个实例,这将达到我正在运行的系统上允许的最大进程数的顶峰。上。除了可以用来减少启动线程数之外,是否还有其他jvm选项? 问题答案: 除了禁用并行或并发GC外,还有以下选项可减少JVM线程数

  • 我有一个Java程序可以在Solaris 10 X86上运行,具有2GB物理内存和2GB交换。 该程序在64位Linux中运行良好,仅消耗约450MB内存。 然而,当它在Solaris中运行时,它总是报告OutOfMemoryError,我注意到在错误发生之前,它正试图使用 那么为什么JVM会尝试使用那么多虚拟内存呢?有没有办法告诉JVM不要使用那么多虚拟内存? 谢谢你。 编辑: 谢谢大家的意见!

  • 这里和这里都有类似的问题,但对JVM参数的更改都没有让我找到相同的解决方案。我只是想减少JVM未使用的堆大小,以便它更接近实际使用情况(将其释放给操作系统)。我一直在使用YourKit来分析内存使用情况,它通常如下所示: 我正在运行智能Ij IDEA社区版64位,在Windows 7 64位,8 GB RAM上运行。我已经编辑了.文件在这里找到: 与上述链接中提到的建议。第一个链接的答案实际上是错