首页 文章

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

提问于
浏览
0

我们基本上调整了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 回答

  • 0

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

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

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

    这没有“明确”的答案,它取决于从应用程序到应用程序,你应该监视你在各种情况下的内存使用情况 . 要做的第一件事可能是设置堆高,但如果你没有用尽大部分内存并且你有内存泄漏,那将会使事情变得复杂 .

相关问题