我正在检查针对特定排序问题的不同算法的运行时间、堆内存使用情况和非堆内存使用情况。
我已经成功地测量了运行时间和堆内存使用情况,但是在测量非堆内存使用情况时遇到了问题。
当我尝试测量它时,我会启动一个新的线程,在我运行排序算法时,它会不断地检查非堆内存是否发生了变化。此线程对象记录该算法运行期间内存使用量的最高值。
这适用于普通的堆内存(或者至少,我认为它提供了逻辑结果),但当我尝试对非堆内存执行同样的操作时,我看到很多内存使用结果为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();
}
}
}
}如何获取实际的非堆内存?我对事物如何工作的假设是正确的吗?
发布于 2011-11-22 20:59:16
您可以尝试使用一些外部工具,如VisualVM或JConsole。我认为他们会让你对虚拟机中发生的事情有一个更清晰的了解。
https://stackoverflow.com/questions/8226961
复制相似问题