我想收集程序的堆使用情况。尤其是从特定的开始事件到结束事件,并且每隔10毫秒设置一个间隔。
我本人尝试实现类似以下的代码。它适用于较慢的时间间隔(例如1秒),但是对于较低的时间间隔(例如100ms),则变为越野车。
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
返回的数字并不值钱-请忽略它们。
您可以从Management API获得更好的结果,例如
MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean().getMemoryUsage();
...和相关方法,这可能会给您比您想知道的更多的信息。