특정 정렬 문제에 대한 실행 시간, 힙 메모리 사용량 및 다른 힙이 아닌 메모리 사용량을 검사하고 있습니다.Java : 힙이 아닌 메모리 사용 검사
실행 시간과 힙 메모리 사용량을 성공적으로 측정 할 수 있었지만 힙이 아닌 메모리 사용량을 측정하는 데 문제가 있습니다.
측정하려고 할 때 정렬 알고리즘을 실행하는 동안 힙이 아닌 메모리가 변경되었는지 지속적으로 확인하는 새로운 스레드가 시작됩니다. 이 스레드 객체는 해당 알고리즘을 실행하는 동안 메모리 사용량 중 가장 높은 값을 기록합니다.
이것은 일반 힙 메모리 (또는 적어도 논리적 인 결과를 제공하는 것으로 생각됩니다)에서 작동하지만 힙이 아닌 메모리에서도 동일한 작업을 시도하면 솔기가 메모리를 많이 차지합니다. 사용 결과.
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();
}
}
}
}
이 어떻게 실제 비 힙 메모리를받을 수 있나요? 그 물건이 어떻게 작동하는지 내 가정입니까?
예, 그게 내 문제를 해결합니다. 감사! memoryMXBean 함수가 힙이 아닌 메모리를 제공 할 수 없다는 나의 가정에 대해 어떻게 생각합니까? 그들은 맞습니까? – nijoakim