从Java运行进程并观察其内存消耗

时间:2015-12-05 15:40:20

标签: java process child-process

我正在编写一个使用java.lang.ProcessBuilder运行外部可执行文件的Java程序。该程序应该能够监视子进程的运行时间和内存使用情况,并在超出某些预定义限制时终止。

对于基于时间的测量,它很容易实现:

boolean inTime = process.waitFor(60, TimeUnit.SECONDS);

但我还没有找到任何方法来观察子进程的内存使用情况。有没有办法在Java中实现这个目标?

提前致谢!

3 个答案:

答案 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)

  

我不知道您到底在问什么,但是如果您正在寻找如何     您的方法在执行或运行时会占用大量内存

Java Mission Control阅读此

  

打开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);