如何调整jvm崩溃而不是英雄GC直到100%的CPU利用率?

时间:2013-01-17 18:31:12

标签: java garbage-collection jvm

我们有一个JVM进程很少将CPU固定在100%,看起来似乎是(根据visualgc)一个非常耗尽的堆。我们的假设是,这个过程是英勇的GC导致CPU峰值,这会影响整个系统的整体运行状况(包括其他JVM做不同的事情)。

此过程并不重要,可以重新启动。有没有办法通过命令行调整JVM,启动它以使其落在自己的剑上而不是保持GC并导致整个盒子受损?

值得注意的是,我们没有获得OOMExceptions,所以堆不完全耗尽,但我们认为几乎没有。

或者,有什么能让我们了解JVM中实际使用CPU的方式,以确认/拒绝我们的GC假设?

5 个答案:

答案 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 .  

有关JVM中Gc调优的更多信息,请参阅this,对于vm调试选项,请检查this

答案 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
  • 可以查看JVM的当前状态(占用一些资源)
  • 同时启用verbosegc(以证明您经常使用GC)

答案 4 :(得分:1)

您需要找到一种方法来收集有关GC工作的统计信息。实际上有一些方法可以做到这一点。我不会复制粘贴,只是给你类似问题的链接:

Can you get basic GC stats in Java?

我相信,您会想到如何分析此统计数据并决定GC何时始终处于活动状态。

因为这个问题包含了应用GC统计数据的一些新想法,所以我认为它不重复。