我们基本上调整了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(使用顶部)时,我发现它消耗的值大于 -JXmx1536
~2GB
.
现在显然,JVM堆已超出 -Jmx
的指定值 .
所以我的问题是......
-
为什么?我没有看到任何Java内存不足异常 .
-
具有4个内核和15GB RAM的
-JXmx
的理想设置是什么(假设除了Java应用程序之外没有其他进程在系统中运行)
1 回答
因为您没有耗尽堆内存,所以启动VisualVM并在设置-Xmx后检查该过程 . 你会注意到有一个名为MetaSpace的区域(默认情况下为1G max),除此之外还有一些方法可以使用额外的内存,例如:用于代码缓存(JIT-ed本机代码)
这没有“明确”的答案,它取决于从应用程序到应用程序,你应该监视你在各种情况下的内存使用情况 . 要做的第一件事可能是设置堆高,但如果你没有用尽大部分内存并且你有内存泄漏,那将会使事情变得复杂 .