【问题标题】:Why does java not seem to respect memory limits? [duplicate]为什么java似乎不尊重内存限制? [复制]
【发布时间】:2018-12-19 10:49:32
【问题描述】:

我有一个 java 应用程序,它使用以下设置运行:

/usr/bin/java ... -XX:+UseG1GC -Xms18G -Xmx22G ...

同时我可以看到java二进制在服务器上使用了27617528的RSS(32453352 virt)。

为什么会这样,我怎样才能确定地限制 java 内存?

【问题讨论】:

  • 32453352k? 32TB?
  • 因为您传递的内存设置与本机内存不同。您在此处设置的内容会影响 Java 进程可用的 JVM 内存。但是 JVM 本身可以为自己的目的消耗内存(系统的)。您还可能遇到本机代码(由您的 JVM 调用)的情况 - 例如通过 JNI - 将分配超出您限制的内存方式(通过 malloc)。
  • 签名...谢谢。 Java 是运营商的一大 WTF。

标签: java memory out-of-memory


【解决方案1】:

使用-Xmx,您只限制了java 堆大小——java 应用程序可用的内存,而不是JVM(运行java 二进制文件)可用的内存。要限制进程的内存,您可以使用ulimit 命令,或者,更现代的方法是创建一个cgroup

$ sudo cgcreate -g memory:/memlimited
$ sudo cgset -r memory.limit_in_bytes=22G memlimited
$ sudo cgexec -g memory:/memlimited /usr/bin/java ... -XX:+UseG1GC ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2019-11-03
    • 2011-10-18
    相关资源
    最近更新 更多