Java ProcessBuilder启动的进程的内存消耗问题

4
有没有办法限制Java ProcessBuilder启动的进程的内存消耗? 或者获取进程使用的最大内存?
我尝试过使用以下代码,但总是返回0。
ProcessBuilder p = new ProcessBuilder(command);
before=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
Process pp = p.start();
after=Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
System.out.println("Used : "+before-after);

我是一个初学者..如果问题很傻,请原谅...

2个回答

4
不,使用ProcessBuilder启动的进程是操作系统进程,无法通过JVM/使用Java APIs控制限制它们的资源。但是,您可以在使用操作系统API(例如,在Linux上使用cgroups)获取进程的PID后尝试限制资源。
此外:
after = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();

与您想象的不同,这与ProcessBuilder无关(除了Java为ProcessBuilder对象进行一些分配)。它返回的是Java Runtime的内存,而不是您使用ProcessBuilder启动的进程。


2

ProcessBuilder 构造函数提供了一种设置程序参数的方式。
比如你有:

public ProcessBuilder(String... command) 

在命令参数vargs中,包含了程序本身以及提供的参数。

此外,您还可以使用带有List参数的构造函数实现相同的目的:

public ProcessBuilder(List<String> command) 

如果您的程序是Java程序,您可以编写以下代码来限制进程使用的最大内存为512M:

ProcessBuilder processBuilder = 
        new ProcessBuilder(pathToTheJavaCommand, "-Xmx512m", "-cp", classpath, yourClass);

如果您的程序不是Java程序,则您的程序应提供设置其分配的最大内存的参数,或者您应使用特定于操作系统的功能来限制所消耗的内存。但第二种情况并不一定好,因为如果程序绝对需要内存,则可能会对启动的程序产生关键性副作用。
最后,Runtime.getRuntime() 返回与当前Java应用程序相关联的运行时对象,而不是最后启动的Process的运行时对象。

如何通过ProcessBuilder限制类似cURL这样的Linux命令的CPU/资源使用?是否有可能实现这一点? - mang4521

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接