我正在编写一个Java程序,该程序使用java.lang.ProcessBuilder
运行外部可执行文件。该程序应该能够监视子进程的运行时间和内存使用情况,如果超过某些预定义的限制,则终止。
对于基于时间的测量,实现起来非常简单:
boolean inTime = process.waitFor(60, TimeUnit.SECONDS);
但我还没有找到任何方法来观察子进程的内存使用情况。有什么方法可以在Java中实现这一点吗?
提前感谢!
我不知道你到底在问什么,但如果你想知道如何在执行或运行时时,您的方法将占用大量内存
Java任务控制读取此
打开JMC(在终端中写"JMC")后,你会发现JFR和Mbeans就在你的右手边,JFR会给你每个方法的名称,它的子方法名称,以及它们占用的内存
这就是你可以检查的方法-::
制作一个有3-4个方法的程序,将它们迭代超过5个lac,这样会花费很多时间,并且您可以在执行时观察发生了什么
现在打开飞行记录器并转到(内存->分配->新tlab中的分配->分配配置文件)
希望你能在这里找到你的ans
您可以做的是使用本地附加并从MemoryMXBean获取堆使用情况,以及从RuntimeMXBean获取正常运行时间。请参阅com.sun.tools.attach.VirtualMachine.类
代码太多了,无法显示,但你可以在这里查看
http://dontpanic.42.nl/2012/05/connecting-to-jvm-programmatically.html
有关如何列出正在运行的虚拟机、如何连接到这些虚拟机并启动管理代理的示例。一旦你有了MBeanServerConnection,你就可以这样做:
MemoryMXBean memoryMBean = JMX.newMXBeanProxy(
connection, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);
RuntimeMXBean runtimeMBean = JMX.newMXBeanProxy(
connection, new ObjectName("java.lang:type=Runtime"), RuntimeMXBean.class);
String pid = runtimeMBean.getName().split("@")[0];
long uptime = runtimeMBean.getUptime();
long memoryUsed = memoryMBean.getHeapMemoryUsage().getUsed();
然后你可以终止这个过程,例如:
Runtime.getRuntime().exec("kill " + pid);
我希望下面能有所帮助:如果您的子进程可以以某种方式发回详细信息,我发现了这一点-Runtime rt=Runtime.getRuntime();long usedMB=(rt.totalMemory()-rt.freeMemory())/1024/1024;logger.information(即"内存使用情况"+usedMB);
在这个线程中;可能会有所帮助:如何监控Java内存使用情况?
如果你想从外部过程进行监控,这看起来很有趣——类似的问题我会说:从使用ProcessBuilder 启动的进程中获取内存使用情况和执行时间
在一个答案中,有人指向这个链接:如何通过JMX以编程方式访问内存使用情况?