为什么Java可以分配比指定堆大小更多的内存

时间:2018-03-12 05:40:15

标签: java jruby

我们基本上正在调整我们的JVM选项。

  

-J-Xms1536M -J-Xmx1536M -J-Xss3M -J-Djruby.memory.max = 1536M -J-Djruby.thread.pool.enabled = true -J-Djruby.compile.mode = FORCE -J- XX:NewRatio = 3 -J-XX:NewSize = 256M -J-XX:MaxNewSize = 256M -J-XX:+ UseParNewGC -J-XX:+ CMSParallelRemarkEnabled -J-XX:+ UseConcMarkSweepGC -J-XX:CMSInitiatingOccupancyFraction = 75 -J-XX:+ UseCMSInitiatingOccupancyOnly -J-XX:SurvivorRatio = 5 -J-server -J-Xloggc:/home/deploy/gcLog/gc.log -J-XX:+ PrintGCDateStamps -J-XX:+ PrintGCDetails -J -XX:+ PrintGCApplicationStoppedTime -J-XX:+ PrintSafepointStatistics -J-XX:PrintSafepointStatisticsCount = 1

我们已将-J-Xmx1536-J-Xms1536M设置为1536M。现在 如果我理解正确的话-J-Xmx代表堆的最大大小。

该系统是4核15GB ram进程。

但是当我检查正在运行的Java进程的RSS(使用top)时,我发现它消耗的值大于-JXmx1536周围的~2GB

现在显然,JVM堆已超出指定的-Jmx值。

所以我的问题是......

  • 为什么呢?我没有看到任何Java内存不足异常。

  • 对于具有4个内核和15GB RAM的-JXmx,理想的设置是什么(假设除了Java应用程序之外没有其他进程在系统中运行)

1 个答案:

答案 0 :(得分:0)

  

为什么呢?我没有看到任何Java内存不足的例外。

因为您没有耗尽堆内存,所以启动VisualVM并在设置-Xmx后检查该过程。您会注意到有一个名为MetaSpace的区域(默认情况下为1G max),此外还有进程可能使用其他内存的方式,例如:代码缓存(JIT-ed本机代码)

  

对于具有4个内核和15GB RAM的-JXmx,理想的设置是什么(假设除了Java应用程序之外没有其他进程在系统中运行)

没有"清除"为此,它取决于从应用程序到应用程序,您应该在各种情况下监视您的内存使用情况。要做的第一件事可能是设置堆高,但如果你没有用尽大部分内存并且你有内存泄漏,那将会使事情变得复杂。