指定GC标记是OutOfMemory异常的可能解决方案,还是没有影响或程序是否会耗尽内存?
相关的GC标记为: - XX:+UseConcMarkSweepGC
和-XX:+CMSIncrementalMode
我问的是因为我认为上面的标志(以及一般的GC标志)可用于调整JVM性能(与其响应/速度相关),但它们对减少程序的最低内存要求没有影响。换句话说,如果没有足够的内存让程序运行完成(例如运行到OutOfMemory异常),那么任何JVM调优都不会解决这个问题。
答案 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调整代数以使用所有内存的程度。
通常情况下,如果您想要使用所有内存,使用的选项越少越好。