我们基本上正在调整我们的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应用程序之外没有其他进程在系统中运行)
答案 0 :(得分:0)
为什么呢?我没有看到任何Java内存不足的例外。
因为您没有耗尽堆内存,所以启动VisualVM并在设置-Xmx后检查该过程。您会注意到有一个名为MetaSpace的区域(默认情况下为1G max),此外还有进程可能使用其他内存的方式,例如:代码缓存(JIT-ed本机代码)
对于具有4个内核和15GB RAM的-JXmx,理想的设置是什么(假设除了Java应用程序之外没有其他进程在系统中运行)
没有"清除"为此,它取决于从应用程序到应用程序,您应该在各种情况下监视您的内存使用情况。要做的第一件事可能是设置堆高,但如果你没有用尽大部分内存并且你有内存泄漏,那将会使事情变得复杂。