我正在编写一个使用java.lang.ProcessBuilder
运行外部可执行文件的Java程序。该程序应该能够监视子进程的运行时间和内存使用情况,并在超出某些预定义限制时终止。
对于基于时间的测量,它很容易实现:
boolean inTime = process.waitFor(60, TimeUnit.SECONDS);
但我还没有找到任何方法来观察子进程的内存使用情况。有没有办法在Java中实现这个目标?
提前致谢!
答案 0 :(得分:-1)
我希望以下内容有所帮助: 如果您的子进程可以以某种方式发回详细信息,我发现 - 运行时rt = Runtime.getRuntime(); long usedMB =(rt.totalMemory() - rt.freeMemory())/ 1024/1024; logger.information(this,“memory usage”+ usedMB);
在这个帖子中;可能会有所帮助: How to monitor Java memory usage?
如果你想从外部进程监控,这看起来很有趣 - 类似的问题我会说: Get memory usage and execution time from a process initiated with the ProcessBuilder
在一个回答中有人指向此链接: How do I access memory usage programmatically via JMX?
答案 1 :(得分:-1)
我不知道您到底在问什么,但是如果您正在寻找如何 您的方法在执行或运行时会占用大量内存
打开JMC(在终端中输入“ jmc”)后,您会在右侧找到JFR和Mbeans,JFR将为您提供每个方法名称,它也是子方法名称以及它们占用的内存
这是您可以如何检查-::
使用3-4种方法制作程序,对它们进行5次以上的迭代,这将花费大量时间,并且您能够观察执行时发生的情况
现在打开飞行记录器,然后转到(内存->分配->新tlab中的分配->分配配置文件)
希望您在这里找到答案
答案 2 :(得分:-1)
您可以做的是使用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);