如何确定Linux中的进程内存限制?

时间:2011-01-10 20:33:05

标签: linux memory process out-of-memory

我一直在网上搜索一下java进程可以在linux(red-hat)机器上占用多少内存。 (我不是在谈论堆;而是由java 进程占用的全部内存量)

我无权在该计算机上执行任何操作。所以我不能简单地执行一个消耗内存的程序,直到内存不足为止。

但是,我确实有权检查配置文件等(例如:我试图执行cat / proc / meminfo,但我无法理解;它似乎没有任何结果代表参数I想知道。)

我已经在一个单独的红帽机器上尝试了一个java程序 - 我有权执行程序 - 我能够看到java程序长大到3GB左右。

有什么方法可以找出进程可以获得多少内存?

3 个答案:

答案 0 :(得分:10)

ulimit是你的朋友。 Java进程与其他进程没有什么不同。但如果你甚至不能运行ulimit -a,那么很难回答你的问题。

答案 1 :(得分:6)

这是一个有用的读物​​:Limiting time and memory consumption of a program in Linux,它导致timeout工具,它允许您通过时间或内存消耗笼养进程(及其分叉)。

答案 2 :(得分:2)

我一直在处理这个确切的问题,如果您使用的是2.6.24或更高版本,则找到最佳解决方案是使用cgroup / cgroups。一个例子是这样的,这是默认的/etc/cgconfig.conf文件,底部添加了一个控制组。此控制组将物理内存的大小限制为100MB,将总虚拟内存分配限制为200MB。

mount {
    cpuset  = /cgroup/cpuset;
    cpu = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

group daemons/java_limited_process {
    memory {
        memory.limit_in_bytes = "104857600";
        memory.memsw.limit_in_bytes = "209715200";
    }
}

配置完成后,我可以像这样添加进程组

cgexec -g memory:daemons/java_limited_process /usr/local/tomcat/bin/startup.sh

这将限制主进程及其产生的任何子进程的内存。它还具有查询控制器中内存使用情况的功能。