我刚刚注意到,由于一个动作(我试图找出),虚拟机停留了几次(看起来像垃圾收集器停止了世界)。 通常小型GC需要0.05秒,突然发生了一些事情,我可以在日志中看到每个小型GC增加到甚至15秒。 虚拟机不稳定大约10分钟。
有没有办法找出源代码中的原因(除了询问用户当时他们在做什么)?
虚拟机在专用机器(Linux OS)中运行,我只能远程访问它。 进程使用的总内存为6 gb(在稳定时刻),因此创建内存快照需要花费大量时间
答案 0 :(得分:1)
15秒听起来过度和情况。您应该检查以便不是简单地交换(特别是在GC本身期间),这可以解释GC的慢速时间。
让vmstat 5
或类似代码运行,并检查si
和so
字段。如果它们不为零,则表示您正在进行交换。
答案 1 :(得分:1)
尝试在YoungGen峰值之前和之后收集线程转储。此外,您可以尝试同时收集类直方图。如果它是一个尖峰的FullGC,你可以使用VM标志来收集每个FullGC之前/之后的类历史图。
jstat
将为您提供有关堆区域占用率的更多见解(与GC日志相比),请尝试收集它。
还可以附加分析器,使用采样模式 - 例如Mission Control具有较低的开销,可以让您深入了解GC峰值期间VM中发生的情况。
收集iostat
,netstat
,vmstat
等将帮助您排除来自VM外部的任何干扰。