我们有一个JVM进程很少将CPU固定在100%,看起来似乎是(根据visualgc)一个非常耗尽的堆。我们的假设是,这个过程是英勇的GC导致CPU峰值,这会影响整个系统的整体运行状况(包括其他JVM做不同的事情)。
此过程并不重要,可以重新启动。有没有办法通过命令行调整JVM,启动它以使其落在自己的剑上而不是保持GC并导致整个盒子受损?
值得注意的是,我们没有获得OOMExceptions,所以堆不完全耗尽,但我们认为几乎没有。
或者,有什么能让我们了解JVM中实际使用CPU的方式,以确认/拒绝我们的GC假设?
答案 0 :(得分:4)
我们可以从
获取统计数据1):选项-XX:+ PrintGCTimeStamps将在每个集合的开头添加时间戳。这对于查看垃圾收集发生的频率非常有用。
通过上面的选项,我们可以粗略估计你是否认为这个过程是英勇的GC导致CPU峰值。
如果您的支持是正确的,那么请开始调整您的GC。
Both parallel collector and Concurrent Collector will throw an OutOfMemoryError if too much time is being
spent in garbage collection: if more than 98% of the total time is spent in garbage collection and
less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. the option X:-UseGCOverheadLimit
is enabled by default for both Parallel and concurrent collector . Check whether this option is disabled in
your system .
答案 1 :(得分:3)
并行和并发收集器具有“开销限制”,可以执行您想要的操作:
如果超过总时间的98%用于垃圾收集并且回收的堆少于2%,则会抛出OutOfMemoryError
有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html。
答案 2 :(得分:2)
最好的办法是找出内存泄漏并修复它。
退出高内存使用率的简单方法:
if(Runtime.getRuntime().totalMemory()>100*1024*1024)
System.exit(0);
答案 3 :(得分:2)
尝试查看当前在JVM中运行的进程。
jstack
你可以进行线程转储(还有其他方法可以做到这一点)jvisualvm
verbosegc
(以证明您经常使用GC)答案 4 :(得分:1)
您需要找到一种方法来收集有关GC工作的统计信息。实际上有一些方法可以做到这一点。我不会复制粘贴,只是给你类似问题的链接:
Can you get basic GC stats in Java?
我相信,您会想到如何分析此统计数据并决定GC何时始终处于活动状态。
因为这个问题包含了应用GC统计数据的一些新想法,所以我认为它不重复。