Java:检查非堆内存使用情况

时间:2011-11-22 12:39:07

标签: java memory

我正在检查运行时间,堆内存使用情况和不同算法的非堆内存使用情况,以解决特定的排序问题。

我已经成功地测量了运行时间和堆内存使用情况,但我在测量非堆内存使用时遇到了问题。

当我尝试测量它时,我做的是启动一个新线程,在我运行排序算法时不断检查非堆内存是否已更改。此线程对象记录运行该算法期间内存使用的最高值。

这适用于普通堆内存(或者至少,我认为它可以提供逻辑结果),但是当我尝试对非堆内存执行相同操作时,我接缝以获得大量的0内存使用量结果

我使用ManagementFactory.memoryMXBean.getNonHeapMemoryUsage()。getUsed()来读取非堆内存,我想在运行垃圾收集器时没有释放这个内存(我运行System.gc()16次,希望能够垃圾收集器在我记录初始内存之前收集垃圾(我知道这只是一个建议,但这应该无关紧要,因为它不会对非堆内存做任何事情(我认为)))。我也猜测当从堆栈弹出的东西时,这个内存没有被释放,因为我的结果在第一次尝试的算法中是最大的,因此我怀疑我只获得每次运行之间的非堆内存使用量的差异,如果后者使用的内存比前者少。

这是我的记忆检查员课程:

class MemoryInspectorThread extends Thread
{
private int samplingInterval;

private long initialMemoryHeap;
private long initialMemoryNonHeap;
private long maxMemoryHeap;
private long maxMemoryNonHeap;

private boolean kill=false;

void kill()
{
    kill=true;
}

long getMaxNewMemoryHeap()
{
    return (maxMemoryHeap-initialMemoryHeap)/1024;
}

long getMaxNewMemoryNonHeap()
{
    return (maxMemoryNonHeap-initialMemoryNonHeap)/1024;
}

MemoryInspectorThread(int samplingInterval)
{
    this.samplingInterval=samplingInterval;

    try
    {
        sleep(1000);
    } catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean();

    System.gc(); System.gc(); System.gc(); System.gc();
    System.gc(); System.gc(); System.gc(); System.gc();
    System.gc(); System.gc(); System.gc(); System.gc();
    System.gc(); System.gc(); System.gc(); System.gc();

    initialMemoryHeap=memoryMXBean.getHeapMemoryUsage().getUsed();
    initialMemoryNonHeap=memoryMXBean.getNonHeapMemoryUsage().getUsed();
}
@Override
public void run()
{
    MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean();

    while (!kill)
    {   
        long freeMemoryHeap=memoryMXBean.getHeapMemoryUsage().getUsed();
        long freeMemoryNonHeap=memoryMXBean.getNonHeapMemoryUsage().getUsed();

        if (freeMemoryHeap > maxMemoryHeap)
        {
            maxMemoryHeap=freeMemoryHeap;
        }

        if (freeMemoryNonHeap > maxMemoryNonHeap)
        {
            maxMemoryNonHeap=freeMemoryNonHeap;
        }

        try
        {
            sleep(samplingInterval);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}
}

如何获得实际的非堆内存?关于事情是如何正确的我的假设是什么?

1 个答案:

答案 0 :(得分:3)

您可以尝试使用VisualVMJConsole之类的som外部工具。我认为他们会让你更清楚地了解虚拟机的情况。