【问题标题】:How come Java can allocate more memory than the specified heap size为什么Java可以分配比指定堆大小更多的内存
【发布时间】:2018-08-20 02:11:44
【问题描述】:

我们基本上是在调整我们的 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内存进程。

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

现在很明显,JVM 堆已经增加到超过-Jmx 的指定值。

所以我的问题是..

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

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

【问题讨论】:

  • 因为 heap 不是 JVM 使用的唯一内存池。还有 JVM 内部内存和线程堆栈,可能还有更多。
  • 如果你的机器有 15GB,为什么你只分配 1.5GB 给 Java?多少是理想的?取决于您的应用程序。
  • @Andreas 就像我说的那样,我们正在测试 JVM 选项……我们最初的测试发现这个数字符合我们的需要,但现在看来,从长远来看,这个值会少得多与我们拥有的可用 RAM 相比。因此是第二个问题。

标签: java jruby


【解决方案1】:

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

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

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

对此没有“明确”的答案,这取决于应用程序,您应该监控各种情况下的内存使用情况。首先要做的可能是将堆设置为高,但如果你没有用完大部分堆并且你有内存泄漏,它会使事情复杂化。

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2015-11-23
    • 2020-10-30
    • 1970-01-01
    • 2011-03-31
    • 2019-07-03
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多