【问题标题】:Limit jvm process memory on ubuntu限制 ubuntu 上的 jvm 进程内存
【发布时间】:2012-02-27 01:57:10
【问题描述】:

我知道有类似this one 的问题被问及回答。我对答案不满意,所以让我在这里输入更多详细信息。

我尝试使用 JVM OPT 启动我的应用程序:-Xmx128m -Xms32m -XX:MaxPermSize=64m。当应用程序启动时,我通过输入cat /proc/10413/status 检查内存使用情况,我发现 vmsize 超过 600512 kB!这比我的设置大得多。我想知道如何限制进程的jvm内存使用。

Name:   java
State:  S (sleeping)
Tgid:   10413
Pid:    10413
PPid:   1
TracerPid:      0
Uid:    1001    1001    1001    1001
Gid:    1007    1007    1007    1007
FDSize: 128
Groups: 1001 1007
**VmPeak:   728472 kB**
**VmSize:   600512 kB**
VmLck:         0 kB
VmHWM:    298300 kB
VmRSS:    280912 kB
VmData:   647804 kB
VmStk:       140 kB
VmExe:        36 kB
VmLib:     13404 kB
VmPTE:       808 kB
VmSwap:        0 kB
Threads:        33
SigQ:   0/31522
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 2000000181005ccf
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:      0-3
Mems_allowed:   00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        3
nonvoluntary_ctxt_switches:     2

【问题讨论】:

    标签: java linux memory jvm


    【解决方案1】:

    你无法控制你想控制的东西-Xmx只控制Java Heap,它不控制JVM对本机内存的消耗,根据实现,它的使用方式完全不同。

    来自以下文章Thanks for the Memory ( Understanding How the JVM uses Native Memory on Windows and Linux )

    维护堆和垃圾收集器使用您无法控制的本机内存。

    需要更多的本机内存来维持 维护 Java 堆的内存管理系统。数据结构 必须分配以跟踪空闲存储并记录进度 收集垃圾。这些数据结构的确切大小和性质 因实施而异,但许多与 堆。

    JIT 编译器使用本机内存,就像 javac 一样

    字节码编译使用本机内存(与静态 gcc 等编译器需要内存才能运行),但输入( 字节码)和来自 JIT 的输出(可执行代码)也必须 存储在本机内存中。 Java 应用程序包含许多 JIT 编译的方法比较小的应用程序使用更多的本机内存。

    然后你就有了使用本机内存的类加载器

    Java 应用程序由定义对象结构的类组成 和方法逻辑。他们还使用 Java 运行时类中的类 库(例如 java.lang.String)并且可能使用第三方 图书馆。这些类需要在内存中存储多久 他们正在被使用。类的存储方式因实现而异。

    我什至不会开始引用线程部分,我想你明白了 -Xmx 不控制你认为它控制的东西,它控制 JVM 堆,而不是一切 进入 JVM 堆,堆占用的本机内存比您指定的要多 管理和簿记。

    【讨论】:

      【解决方案2】:

      与 Linux 上的任何其他进程一样,您可以限制 JVM 进程的内存使用量(比如 4 GB):

      $ ulimit -v 4194304
      $ java ...   # execute your Java program
      

      (从技术上讲,这实际上是虚拟内存,是实际内存使用的上限。But ulimit apparently doesn't work with actual RAM usage.

      这将导致超出限制的内存分配失败,可能会导致OutOfMemoryError 和您的应用程序退出。

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2014-05-07
        • 2011-01-24
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多