首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以通过指定GC标志来修复OutOfMemory错误?

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

Stack Overflow用户
提问于 2012-10-23 03:20:44
回答 3查看 171关注 0票数 1

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-23 03:23:29

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-23 03:22:46

如果你的代码中有内存泄漏,这些标志就没有用处了。

根据Virtual Machine Garbage Collection Tuning

除非您的应用程序对暂停时间有非常严格的要求,否则请先运行您的应用程序并允许VM选择一个收集器。如有必要,调整堆大小以提高性能。如果性能仍然不能满足您的目标,请使用以下准则作为选择收集器的起点。

如果应用程序具有较小的数据集(最大约为100MB),则

使用-XX:+UseSerialGC.选择串行收集器的

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

使用-XX:+UseSerialGC.,

  • 允许虚拟机选择收集器,或
  • 选择串行收集器

如果(a)应用程序的峰值性能是第一优先级,并且(b)不存在暂停时间要求或一秒或更长时间的暂停是可接受的,则

  • 允许虚拟机选择收集器,或
  • 使用-XX:+UseParallelGC选择并行收集器,并(可选)使用-XX:+UseParallelOldGC.

启用并行压缩

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

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

Stack Overflow用户

发布于 2012-10-23 03:24:26

唯一重要的调优参数是最大内存。例如,-Xmx-mx如果你的程序由于内存泄漏而耗尽了内存,即使提高这个值也无济于事。

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

一般来说,如果你想使用你所有的内存,你使用的选项越少越好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13018289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档