是否可以通过指定GC标志来修复OutOfMemory错误?

时间:2012-10-22 19:20:44

标签: java garbage-collection jvm out-of-memory

指定GC标记是OutOfMemory异常的可能解决方案,还是没有影响或程序是否会耗尽内存?

相关的GC标记为: - XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode

我问的是因为我认为上面的标志(以及一般的GC标志)可用于调整JVM性能(与其响应/速度相关),但它们对减少程序的最低内存要求没有影响。换句话说,如果没有足够的内存让程序运行完成(例如运行到OutOfMemory异常),那么任何JVM调优都不会解决这个问题。

3 个答案:

答案 0 :(得分:3)

如果你得到OutOfMemoryError: heap space,你无能为力。在将最后一个字节从GC中移出之前,JVM永远不会抛出它。

但是,如果你得到OutOfMemoryError: GC overhead limit exceeded,那么你可能仍然可以做一些事情,因为这是一个“软”错误,并且可能有一个配置设置会减少GC开销。我不得不补充一点,但至少在理论上是可能的。

答案 1 :(得分:1)

如果代码中存在内存泄漏,则这些标志无效。

根据Virtual Machine Garbage Collection Tuning

  

除非您的应用程序具有相当严格的暂停时间要求,否则首先运行您的应用程序并允许VM选择收集器。如有必要,请调整堆大小以提高性能。如果性能仍然无法达到您的目标,请使用以下指南作为选择收集器的起点。

     

如果应用程序的数据集很小(最多约100MB),那么

     
      
  • 使用-XX:+UseSerialGC选择序列收集器。
  •   
     

如果应用程序将在单个处理器上运行且没有暂停时间要求,那么

     
      
  • 让VM选择收集器,或
  •   
  • 使用-XX:+UseSerialGC选择序列收集器。
  •   
     

如果(a)峰值应用性能是第一优先级,(b)没有暂停时间要求或暂停一秒或更长时间是可以接受的,那么

     
      
  • 让VM选择收集器,或
  •   
  • 选择带有-XX:+UseParallelGC的并行收集器,并(可选)启用与-XX:+UseParallelOldGC的并行压缩。
  •   
     

如果响应时间比整体吞吐量更重要,垃圾收集暂停时间必须短于大约一秒,那么

     
      
  • 选择-XX:+UseConcMarkSweepGC的并发收集器。如果只有一个或两个处理器可用,请考虑使用增量模式,如下所述。
  •   

答案 2 :(得分:1)

唯一重要的调整参数是最大内存。 ie -Xmx-mx如果你的程序由于内存泄漏导致内存不足,即使提出这个也无济于事。

BTW:设置内存调整实际上可以减少在用完之前可以使用的内存量。例如。如果设置NewSize,这可以限制JVM调整代数以使用所有内存的程度。

通常情况下,如果您想要使用所有内存,使用的选项越少越好。