首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:检查非堆内存使用情况

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

Stack Overflow用户
提问于 2011-11-22 20:39:07
回答 1查看 2.5K关注 0票数 2

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

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

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

这适用于普通的堆内存(或者至少,我认为它提供了逻辑结果),但当我尝试对非堆内存执行同样的操作时,我看到很多内存使用结果为0。

我使用ManagementFactory.memoryMXBean.getNonHeapMemoryUsage().getUsed()读取非堆内存,并且我认为在运行垃圾收集器时不会释放这些内存(我运行System.gc() 16次,希望在记录初始内存之前让垃圾收集器收集垃圾(我知道这只是一个建议,但是这并不重要,因为它无论如何都不会对非堆内存做任何事情(我认为)。我还猜测,当从堆栈中弹出内容时,这些内存不会被释放,因为我的结果在第一次尝试的算法中是最大的,因此我怀疑,如果后一次运行使用的内存比前一次少,那么每次运行之间的非堆内存使用量的差异就只有0。

这是我的内存检查器类:

代码语言:javascript
运行
复制
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();
        }
    }
}
}

如何获取实际的非堆内存?我对事物如何工作的假设是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-22 20:59:16

您可以尝试使用一些外部工具,如VisualVMJConsole。我认为他们会让你对虚拟机中发生的事情有一个更清晰的了解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8226961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档