我想收集程序的堆使用情况。尤其是从特定的开始事件到结束事件,并且每隔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();

...和相关方法,这可能会给您比您想知道的更多的信息。

08-03 22:33