两个事件之间的 Java 堆分析

标签 java profiling memory-management

我想收集程序的堆使用情况。特别是从一个特定的开始事件到结束事件,并且有一个设定的间隔,例如每 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/

相关文章:

c++ - 当您不知道确切的元素数量但可以估计上限时,分配比数组所需更多的内存是否可以?

ios - 当 block 内的 ivar 可能被释放时,管理内存的最佳方法是什么?

java - 这段代码获取json数据有什么错误?

java - 无法加载库: xuggle; version: 5; Using POM

ant - Apache Ant探查器

mysql - 如何监控 MySQL 查询错误、超时和登录尝试?

c++ - 非常困倦地分析Qt应用程序,如何分析结果?

.net - FileStream 和内存使用

java - 从 Spring 异常处理程序中读取 httprequest 内容

java - 如何在没有按钮的情况下计算两个edittext的值?