我想收集程序的堆使用情况。特别是从一个特定的开始事件到结束事件,并且有一个设定的间隔,例如每 10 毫秒。 我自己尝试实现了这样的东西,就是下面的代码。它适用于较慢的间隔,如 1 秒,但对于较低的间隔,如 100 毫秒,它会变得有问题。 System.gc() 方法是否会阻塞所有线程直到它完成?我目前假设是这样。
public void startAsync()
{
running = true;
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
while (running)
{
measure();
try
{
Thread.sleep(wait);
} catch (InterruptedException e)
{
throw new RuntimeException();
}
}
}
});
thread.start();
}
public void measure()
{
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
memoryBean.gc();
long currentTime = System.currentTimeMillis();
MemoryUsage memoryUsage = memoryBean.getHeapMemoryUsage();
writer.exec(currentTime - startTime, memoryUsage.getUsed());
}
最佳答案
java.lang.Runtime
返回的数字值(value)不大 - 忽略它们。
您将从 Management API 获得更好的结果,例如
MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean().getMemoryUsage();
...和相关方法,它们可能会为您提供比您想知道的更多的信息。
关于两个事件之间的 Java 堆分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4367883/