【问题标题】:JVM takes the whole XMX memory at startupJVM 在启动时占用整个 XMX 内存
【发布时间】:2021-10-05 22:49:18
【问题描述】:

编辑:

我正在更改我的问题以使其更加明确。

这是我的应用程序,在 java8 中使用默认 gc 运行: 是的,有很多 gc 时间,但是,我提交的内存适合我实际使用的内存(我知道这不是所需的行为)

现在,让我们看看当我们设置 G1 gc 时会发生什么:

您可以看到已提交的内存远大于已使用的内存。

您可能想知道第一次和第二次执行之间发生了什么变化: 第一个与 JVM_ARGS 一起使用:-Xms1024m -Xmx20048m -XX:MaxGCPauseMillis=100

第二个:-XX:+UseG1GC -Xms1024m -Xmx20048m -XX:MaxGCPauseMillis=100 -XX:+UseStringDeduplication

我已经阅读了很多关于 G1 GC 的内容,但是,我不明白为什么这个简单的改变会让我的记忆行为如此不同?

【问题讨论】:

  • “我的进程消耗不超过 1.5GB” => 你怎么知道?
  • 激活 GC 日志(例如参见 baeldung.com/java-gc-logging-to-file),您可能会看到发生了什么。很可能内存已投入使用,并且您将进行更频繁/更昂贵的垃圾回收,并且具有较低的限制。
  • 也得到一个堆转储

标签: java garbage-collection jvm


【解决方案1】:

this document from Oracle 中所述,-Xmx 设置 jvm 的最大可用内存,-Xms 设置初始内存,因此使用您的值,jvm 在 stat up 和 up to 时使用 1024mb跑步时4096m。所以这个设置更多的是一个限制而不是一个消耗值。
将它比作一个桶:如果它可以容纳 10 升,则不必将 10 升装到这个桶中,也可以只装 2 升

【讨论】:

  • 感谢您的回答。我了解 xms 和 xmlx 的工作原理以及所有这些内容。但是,正如您在我的编辑中看到的那样,我的应用程序并没有真正消耗该内存。我的意思是,提交的内存远高于实际使用的内存。发生这种情况有什么原因吗?
  • 提交的内存是为应用程序保留的。所以你的程序“拥有”这么多内存,但它不需要使用它们。参考我的 Bucket 示例,The 10L Bucket 是您提交/保留的内存。你可以使用它,但你不需要。您也只能将这 10 升中的 2 升用于液体。对于您的应用程序:您给了它更多内存,但它不需要那么多,因此它使用的内存更少。
  • 我知道,但是,我的 xms 是 1024 MB,当它不是真的需要时,java 提交所有这些内存是没有意义的。那么,它为什么要提交这么多内存呢?
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2021-11-17
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多