垃圾收集器失控

3
我刚刚注意到,由于某个动作(我正在努力找出原因),虚拟机多次卡顿(看起来像是垃圾回收器“停止世界”)。 通常情况下,小型GC只需要0.05秒,但突然间发生了某些事情,我可以在日志中看到每个小型GC的时间甚至增加到了15秒。 虚拟机不稳定持续了约10分钟。
除了询问用户在那一刻做了什么之外,有没有其他方法在源代码中找出原因?
虚拟机在专用机器(Linux操作系统)上运行,我只能远程访问它。 进程使用的总内存为6 GB(在稳定时期),因此创建内存快照需要很长时间。

如果你还没有看过这个,你可能会对这个线程感兴趣。它提供了一个调试虚拟机的例子:https://dev59.com/YHNA5IYBdhLWcg3wKaYx#1849365 - Klazen108
你尝试过使用带有并行新生代的并发标记-清除垃圾收集器吗? - Rogue
我正在使用以下参数:-Xmx16G -XX:PermSize=2G -XX:+UseConcMarkSweepGC -XX:+UseTLAB -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./gc.log - user3009344
2个回答

1

在任何情况下,15秒钟都听起来过长。您应该检查一下,以确保您不是简单地进行交换(特别是在GC本身期间),这可能会解释缓慢的GC时间。

运行vmstat 5或类似命令,并检查siso字段。如果它们不为零,则正在进行交换。


1
尝试在YoungGen峰值之前和之后收集线程转储。此外,您可以尝试同时收集类直方图。如果是FullGC导致峰值,您可以使用VM标志,在每次FullGC之前/之后收集类直方图。使用jstat将让您更深入地了解堆区占用情况(与GC日志相比),请尝试收集该信息。还可以附加分析器,并使用采样模式 -例如Mission Control,它具有低开销,应该能够让您了解在VM中发生的GC峰值期间正在发生什么。收集iostat、netstat、vmstat等信息将帮助您排除VM外部的任何干扰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接