指定GC标志是OutOfMemory异常的可能解决方案,还是没有影响,或者程序是否会耗尽内存?
有问题的GC标志是:-XX:+UseConcMarkSweepGC
和-XX:+CMSIncrementalMode
我之所以问这个问题,是因为我认为上面的标志(以及一般的GC标志)是用来调优JVM性能(与它的响应/速度相关的)的,但它们对减少程序的最小内存需求没有任何影响。换句话说,如果没有足够的内存让程序运行到完成(例如遇到OutOfMemory异常),那么再多的OutOfMemory调优都不能解决这个问题。
发布于 2012-10-23 03:23:29
如果你得到了OutOfMemoryError: heap space
,你就无能为力了。JVM永远不会在GCing堆的最后一个字节之前抛出这个。
然而,如果你得到了OutOfMemoryError: GC overhead limit exceeded
,那么你可能仍然可以对它做些什么,因为这是一个“软”错误,并且可能有一个配置设置可以减少GC开销。我必须补充说,这很不可能,但至少在理论上是可能的。
发布于 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
选择并发收集器。如果只有一个或两个处理器可用,请考虑使用增量模式,如下所述。发布于 2012-10-23 03:24:26
唯一重要的调优参数是最大内存。例如,-Xmx
或-mx
如果你的程序由于内存泄漏而耗尽了内存,即使提高这个值也无济于事。
顺便说一句:设置内存调优实际上可以减少在内存耗尽之前可以使用的内存量。例如,如果您设置了NewSize,这可能会限制JVM可以调整代的大小以使用所有内存。
一般来说,如果你想使用你所有的内存,你使用的选项越少越好。
https://stackoverflow.com/questions/13018289
复制相似问题