我一直在网上搜索一下java进程可以在linux(red-hat)机器上占用多少内存。 (我不是在谈论堆;而是由java 进程占用的全部内存量)
我无权在该计算机上执行任何操作。所以我不能简单地执行一个消耗内存的程序,直到内存不足为止。
但是,我确实有权检查配置文件等(例如:我试图执行cat / proc / meminfo,但我无法理解;它似乎没有任何结果代表参数I想知道。)
我已经在一个单独的红帽机器上尝试了一个java程序 - 我有权执行程序 - 我能够看到java程序长大到3GB左右。
有什么方法可以找出进程可以获得多少内存?
答案 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
这将限制主进程及其产生的任何子进程的内存。它还具有查询控制器中内存使用情况的功能。