我正在检查运行时间,堆内存使用情况和不同算法的非堆内存使用情况,以解决特定的排序问题。
我已经成功地测量了运行时间和堆内存使用情况,但我在测量非堆内存使用时遇到了问题。
当我尝试测量它时,我做的是启动一个新线程,在我运行排序算法时不断检查非堆内存是否已更改。此线程对象记录运行该算法期间内存使用的最高值。
这适用于普通堆内存(或者至少,我认为它可以提供逻辑结果),但是当我尝试对非堆内存执行相同操作时,我接缝以获得大量的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();
}
}
}
}
如何获得实际的非堆内存?关于事情是如何正确的我的假设是什么?