等于 JVM 中的 -Xms 和 -Xmx
Equal -Xms and -Xmx in JVM
我有一个 Java 微服务器,它在我刚刚继承的生产中每天都在增加内存。它目前正在使用 4GB 堆的 80%,并且每天都在增加几个百分点。
JVM 选项中的 -Xms 和 -Xmx 值均设置为 4GB。
这是否意味着垃圾收集器在 JVM 达到其堆限制之前不会激活?
这意味着 JVM 将始终分配 4GB 的堆。它可能会或可能不会 运行 堆满之前的 GC。 AFAIK 这取决于 GC 实现。我的经验是,在堆(几乎)满之前它不会进行垃圾回收,但并非所有实现都如此。如果您怀疑存在内存泄漏,我建议减少 -Xms,然后监控堆是否增长超过 -Xms 值。
顺便说一句:这个高 -Xms 值是否有原因?我见过的所有情况都指定了 -Xms,这是错误/缺乏知识
Does this mean the garbage collector wont activate until the JVM reaches its heap limit?
不,只要 GC 算法告诉它,垃圾收集器就会激活其收集周期 - 这将通常 是频繁的增量收集,偶尔是完全收集。 运行 堆外可以强制它更频繁地执行完整收集并且更积极,但它肯定不是真的(对于我知道的所有 GC 实现)说它不会做 任何东西,直到它用完或几乎用完堆 space。
可能发生的事情(取决于 GC 算法)是增量收集按预期定期执行,但无法正确清除所有内容 - 并且较慢的完全收集直到您 space 较低时才会执行收集。这是完全有效的行为——您已经为 VM 提供了 4GB 堆,它会以它认为合适的方式使用它。如果是这种情况,当它接近 4GB 限制并执行完整收集时,您会看到突然下降。
或者,您的应用程序可能存在内存泄漏,最终会 运行 内存不足,无法释放任何 space,然后抛出 OutOfMemoryError
.
如果是我,我会在测试环境下对应用程序进行概要分析和压力测试,并设置相同的堆和 GC 选项来检查行为 - 这确实是确定答案的唯一方法。
我有一个 Java 微服务器,它在我刚刚继承的生产中每天都在增加内存。它目前正在使用 4GB 堆的 80%,并且每天都在增加几个百分点。
JVM 选项中的 -Xms 和 -Xmx 值均设置为 4GB。
这是否意味着垃圾收集器在 JVM 达到其堆限制之前不会激活?
这意味着 JVM 将始终分配 4GB 的堆。它可能会或可能不会 运行 堆满之前的 GC。 AFAIK 这取决于 GC 实现。我的经验是,在堆(几乎)满之前它不会进行垃圾回收,但并非所有实现都如此。如果您怀疑存在内存泄漏,我建议减少 -Xms,然后监控堆是否增长超过 -Xms 值。 顺便说一句:这个高 -Xms 值是否有原因?我见过的所有情况都指定了 -Xms,这是错误/缺乏知识
Does this mean the garbage collector wont activate until the JVM reaches its heap limit?
不,只要 GC 算法告诉它,垃圾收集器就会激活其收集周期 - 这将通常 是频繁的增量收集,偶尔是完全收集。 运行 堆外可以强制它更频繁地执行完整收集并且更积极,但它肯定不是真的(对于我知道的所有 GC 实现)说它不会做 任何东西,直到它用完或几乎用完堆 space。
可能发生的事情(取决于 GC 算法)是增量收集按预期定期执行,但无法正确清除所有内容 - 并且较慢的完全收集直到您 space 较低时才会执行收集。这是完全有效的行为——您已经为 VM 提供了 4GB 堆,它会以它认为合适的方式使用它。如果是这种情况,当它接近 4GB 限制并执行完整收集时,您会看到突然下降。
或者,您的应用程序可能存在内存泄漏,最终会 运行 内存不足,无法释放任何 space,然后抛出 OutOfMemoryError
.
如果是我,我会在测试环境下对应用程序进行概要分析和压力测试,并设置相同的堆和 GC 选项来检查行为 - 这确实是确定答案的唯一方法。