gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:07:06 24 4
gpt4 key购买 nike

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

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

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

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

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

这是我的内存检查器类:

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();
}
}
}
}

如何获得实际的非堆内存?我对事情如何运作的假设是否正确?

最佳答案

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

关于Java:检查非堆内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8226961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com