Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个事件之间的Java堆分析_Java_Profiling_Memory Management - Fatal编程技术网

两个事件之间的Java堆分析

两个事件之间的Java堆分析,java,profiling,memory-management,Java,Profiling,Memory Management,我想收集程序的堆使用情况。特别是从一个特定的开始事件到一个结束事件,并且有一个设定的间隔,例如每10毫秒。 我自己尝试实现类似的东西,这是下面的代码。它适用于缓慢的时间间隔,如1秒,但对于较低的时间间隔,如100ms,它会变成小车。 gc()方法是否会阻止所有线程直到完成?我现在假设是这样 public void startAsync() { running = true; Thread thread = new Thread(new Runnable() {

我想收集程序的堆使用情况。特别是从一个特定的开始事件到一个结束事件,并且有一个设定的间隔,例如每10毫秒。 我自己尝试实现类似的东西,这是下面的代码。它适用于缓慢的时间间隔,如1秒,但对于较低的时间间隔,如100ms,它会变成小车。 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
返回的数字没有多大价值-忽略它们

您将从管理API中获得更好的结果,例如

MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean().getMemoryUsage();

。。。以及相关的方法,这些方法可能会为您提供比您想知道的多得多的信息。

非常棒(除了作为一个满意的客户之外,没有其他连接)。

您可以使用jmap-heap从命令行执行此操作


每x秒循环一行脚本。

我建议您遵循NetBeans IDE提供的精确测量,而不是在命令提示符下浪费时间


JProfiler是监控此类问题的最佳工具。

您的测量也会测量自身:)评估许可证可能是诊断问题所需的全部。;)