【问题标题】:Why is the java process user more memory than -XX:MaxRAM? [duplicate]为什么java进程用户的内存比-XX:MaxRAM多? [复制]
【发布时间】:2020-03-20 14:52:07
【问题描述】:

我已将 java 进程的选项设置为使用 1g 最大内存的 80%。但是当我使用“ps -o vsz”时,我看到它使用的是 3.5g(从 2.5g 开始)。这会导致大量交换并因此冻结设备。为什么会出现差异?

更新:JVM 的选项现在是:-Xmx256m -Xshare:off -XX:+UseSerialGC -XX:NativeMemoryTracking=summary -XX:MaxRAM=768m -XX:MaxRAMPercentage=60。他们似乎没有改变任何东西。该过程从 2.4g 开始,增长到 3.5g

更新 2:

openjdk version "14" 2020-03-16
OpenJDK Runtime Environment (build 14+36)
OpenJDK 64-Bit Server VM (build 14+36, mixed mode)

【问题讨论】:

  • Java 进程是做什么的?它是否分配堆外内存?
  • 它读取文件。这是第三者,所以不确定。如何判断它是否分配了堆外内存(可能是 mmap 文件?),有没有办法限制它?
  • 你正在传递-XX:MaxRAM=800m
  • 我开始将其设置为 1g。我现在的选择:-Xmx256m -Xshare:off -XX:+UseSerialGC -XX:NativeMemoryTracking=summary -XX:MaxRAM=768m -XX:MaxRAMPercentage=60
  • 包括您的 JDK 版本详细信息、操作系统版本以及您能想到的任何其他技术详细信息。您似乎还包含了多个相互冲突的参数(XmxMaxRAMMaxRAMPercentage),所以这可能无济于事。

标签: java memory jvm


【解决方案1】:

正确的选项是-Xmx1g:

  • -X:此 java 实现的特定选项。
  • mx: 最大堆内存
  • 1g:1 GB。

    您可能还想申请设置最小值的-Xms1g。现在你的 RAM 负载 java 应用很稳定。

请注意,您的 VM 的内存负载仍可能超过 1GB(虽然 3.5 听起来有些过大):堆并不是 VM 使用的唯一内存;每个线程占用“1 个堆栈”的价值,这也是可配置的(例如通过 -Xss128k),因此如果您有大量线程,内存负载会增加(每个线程有半兆堆栈,4000 个线程意味着 1 GB堆栈内存的价值!)。 VM 自己的运行时内容也存在于堆之外。

此外,共享库占用的内存需要由操作系统“记账”;我相信通常操作系统只是将它们的全部内存负载添加到使用共享库的每个进程中,而 java 倾向于声称它“使用”了大多数已经加载的进程,这也增加了数量。

事实证明,有时测量一个应用占用多少内存非常困难。

【讨论】:

  • -Xmx 和 -XX:MaxRam 是两个不同的标志。
【解决方案2】:

-XX:MaxRam 不是正确的选项,使用 -Xmx

【讨论】:

  • Xmx 没有帮助
  • -Xmx 和 -XX:MaxRam 是两个不同的标志。
  • 是的,它们是不同的东西,但 Xmx 是首选方法。 -Xmx=800m 应该可以满足他的需要。
  • 正如所写,它没有。
猜你喜欢
  • 2015-03-20
  • 2020-10-30
  • 1970-01-01
  • 2014-07-24
  • 2021-09-20
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多