2011-11-22 2 views
2

특정 정렬 문제에 대한 실행 시간, 힙 메모리 사용량 및 다른 힙이 아닌 메모리 사용량을 검사하고 있습니다.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(); 
     } 
    } 
} 
} 

이 어떻게 실제 비 힙 메모리를받을 수 있나요? 그 물건이 어떻게 작동하는지 내 가정입니까?

답변

3

VisualVM 또는 JConsole과 같은 som 외부 도구를 사용해보세요. VM에서 무슨 일이 일어나고 있는지 훨씬 더 명확하게 보여줄 것입니다.

+0

예, 그게 내 문제를 해결합니다. 감사! memoryMXBean 함수가 힙이 아닌 메모리를 제공 할 수 없다는 나의 가정에 대해 어떻게 생각합니까? 그들은 맞습니까? – nijoakim

관련 문제