1

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

有问题的 GC 标志是: -XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode

我之所以问,是因为我认为上述标志(以及一般的 GC 标志)可以调整 JVM 性能(与其响应/速度相关),但它们对降低程序的最低内存要求没有影响。换句话说,如果没有足够的内存让程序运行完成(例如运行到 OutOfMemory 异常),那么再多的 JVM 调整也无法解决这个问题。

4

3 回答 3

3

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

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

于 2012-10-22T19:23:29.273 回答
1

如果您的代码中存在内存泄漏,则这些标志没有用。

根据虚拟机垃圾收集调整

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

如果应用程序有一个小数据集(最多大约 100MB),那么

  • 用 选择串行收集器-XX:+UseSerialGC

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

  • 让 VM 选择收集器,或者
  • 用 选择串行收集器-XX:+UseSerialGC

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

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

如果响应时间比总体吞吐量更重要,并且垃圾收集暂停必须保持在大约一秒以内,那么

  • 选择并发收集器-XX:+UseConcMarkSweepGC。如果只有一个或两个处理器可用,请考虑使用增量模式,如下所述。
于 2012-10-22T19:22:45.567 回答
1

唯一重要的调整参数是最大内存。即-Xmx,或者-mx 如果您的程序由于内存泄漏而耗尽内存,即使提高它也无济于事。

顺便说一句:设置内存调整实际上可以减少您在用完之前可以使用的内存量。例如,如果您设置 NewSize,这可以限制 JVM 可以调整代大小以使用所有内存的程度。

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

于 2012-10-22T19:24:26.230 回答