为Java堆空间设置低Xmx有什么好处?

时间:2013-06-14 05:03:43

标签: java performance heap heap-memory

我们可以为带有-Xmx的java VM设置java堆空间的最大可能内存,例如。 -Xmx1g。

如果优先级是不会发生java OutOfMemoryError堆空间,为什么要将-Xmx设置为低于某个值?如果最大值较低,VM是否更有效地管理内存?

我经常遇到OutOfMemoryError,我将-Xmx设置得非常高。问题是最终我的物理内存耗尽 - 仅仅高Xmx是不够的。我目前的解决方案是关闭我的内存饥饿应用程序,这非常不方便,因为它会减慢开发和测试速度。

4 个答案:

答案 0 :(得分:2)

我的主要原因是确保JVM内存使用量适合可用的RAM。假设我有4个tomcat实例在8g ram的机器上运行。我可能会将mX设置为每个vm大约2g,并允许2g用于os和其他。

如果JVM被强制进行交换,它会在垃圾收集器导航对象树时产生巨大的性能问题。

答案 1 :(得分:0)

我相信如果记忆量更大,那么它需要进行GC编辑,并且可能会有很多垃圾,因为GC可以放松这么大的空间。但是,GC必须处理更多内存,这反过来可能会使GC更慢。

JVM堆大小决定VM花费多少时间以及收集垃圾的时间。垃圾收集的可接受速率是特定于应用程序的,应在分析垃圾收集的实际时间和频率后进行调整。如果设置较大的堆大小,则完全垃圾收集速度较慢,但​​发生频率较低。如果根据内存需求设置堆大小,则完全垃圾回收更快,但更频繁地发生。

答案 2 :(得分:0)

无需将-XMX参数设置为低。只需将其设置为应用程序所需的值即可。但重要的是要注意,使用更高的-XMX-Value,GC-Time会增加,因此可能会发生应用程序无法响应(取决于您使用的收集器)。出于个人经验1G不是很高。我有4G,8G或16G的JVM,运行正常

答案 3 :(得分:0)

-Xms和-Xmx参数分别定义最小和最大堆大小。

由于GC在代数填满时发生,因此吞吐量与可用内存量成反比。

默认情况下,JVM会在每个GC上增大或缩小堆,以尝试将可用空间的比例保持在特定范围内每个集合的活动对象上。该范围通过参数-XX:MinHeapFreeRatio = minimum和-XX:MaxHeapFreeRatio = maximum设置为百分比;和总大小由-Xms和-Xmx限制。

oracle网站上有一些可用于Glassfish调优的Java堆大小调整指南,但对于任何JVM都应该适用。

http://docs.oracle.com/cd/E18930_01/html/821-2431/abeic.html#abeij

IBM的故障排除指南建议针对特定于应用程序的堆使用,最小堆使用率约为40%,最大堆使用率约为70%

http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=%2Fcom.ibm.java.doc.igaa%2F_1vg000139b8b453-11951f1e7ff-8000_1001.html

如果最大值较低,VM是否会更有效地管理内存?

可能不会过度分配堆大小对象将更正确地“填充”到正确的内存生成,因为具有较大的堆大小将执行GC将意味着更多的对象在年轻代中停留更长时间,从而提供更快的垃圾收集的代价是内存使用量增加一倍。

我不会看到任何额外的开销,但是导致应用程序内存不足的原因是内存分配很大,并且最有可能存在大型对象存储在内存中或存在内存泄漏应用程序中的某个地方比堆管理更紧迫。

http://docs.oracle.com/javame/config/cdc/cdc-opt-impl/ojmeec/1.1/custom/html/tuning.htm