两个事件之间的Java堆分析
我想收集程序的堆使用情况。特别是从一个特定的开始事件到一个结束事件,并且有一个设定的间隔,例如每10毫秒。 我自己尝试实现类似的东西,这是下面的代码。它适用于缓慢的时间间隔,如1秒,但对于较低的时间间隔,如100ms,它会变成小车。 gc()方法是否会阻止所有线程直到完成?我现在假设是这样两个事件之间的Java堆分析,java,profiling,memory-management,Java,Profiling,Memory Management,我想收集程序的堆使用情况。特别是从一个特定的开始事件到一个结束事件,并且有一个设定的间隔,例如每10毫秒。 我自己尝试实现类似的东西,这是下面的代码。它适用于缓慢的时间间隔,如1秒,但对于较低的时间间隔,如100ms,它会变成小车。 gc()方法是否会阻止所有线程直到完成?我现在假设是这样 public void startAsync() { running = true; Thread thread = new Thread(new Runnable() {
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
返回的数字没有多大价值-忽略它们
您将从管理API中获得更好的结果,例如
MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean().getMemoryUsage();
。。。以及相关的方法,这些方法可能会为您提供比您想知道的多得多的信息。非常棒(除了作为一个满意的客户之外,没有其他连接)。您可以使用jmap-heap从命令行执行此操作
每x秒循环一行脚本。我建议您遵循NetBeans IDE提供的精确测量,而不是在命令提示符下浪费时间