2010-08-11 4 views
3

자바 코드를 작성하고 일부 성능 테스트를 실행하고 싶습니다. 내 클래스의 메서드 중 하나에서만 사용하는 힙 메모리를 가져 오려고합니다.자바 클래스의 메소드에 의해 사용 된 힙 메모리를 얻으십시오.

public AccessControl { 

    public boolean Allowed() { 
     code 
     } 
    public void print() { 
    code } 
} 

런타임시 메소드 허용이 호출 될 때마다 자바에서 사용 된 힙 메모리를 가져 오려고합니다. 내가 HPROf를 통해 할 수있는 읽을 수 있지만 HPROf 나던 방법에 대한 메모리 계산을 제공하지만 클래스에 대해서만 사용할 수있는 메모리 및 다음 사용되는 메모리를 얻으려면 메서드 안에 쓸 수있는 코드가 나타났습니다? 감사합니다

답변

1

"방법으로 사용되는 힙 메모리"같은 것은 없습니다. 메서드는 힙 메모리를 사용하지 않으므로 개체가 수행합니다.

특정 메소드 (물론 직접 또는 간접적으로 호출하는 메소드) 내에서 생성 된 객체에 관심이있는 경우 메소드 호출 전후에 작성된 힙 스냅 샷을 비교할 수 있습니다. 디버거 및 중단 점 설정).

하지만 실제 문제는 무엇입니까? 메모리 누출은 보통 명백하게 불필요한 객체에 대한 GC 루트를 먼저 찾은 다음 디버거를 사용하여 이러한 참조가 설정된 이유를 알아냅니다.

+0

예 내가 내에서 생성 된 객체에 관심이 코드 아래 사용 방법. 난 그냥 내 메서드의 성능을 평가하고 싶지 않아요 (시간과 메모리를 필요로 함) 메소드가 많은 시간을 호출하고 그 클래스에있는 객체가 사용하는 메모리를 원하기 때문에 디버깅을 할 수 없습니다. 계산되고 실행이 완료된 후 볼 수있는 파일로 전송됩니다. –

+0

@Sara : 힙 메모리의 포인트는 전체 응용 프로그램에서 공유한다는 것입니다. 메서드는 많은 다른 메서드에서 사용되는 개체를 만듭니다. 그래서이 의심스러운 통계를 수집 할 방법이 없습니다. –

+0

확인해 주셔서 감사합니다. 나는 무엇을해야하는지 알 것이다. 요점은 내가 응용 프로그램의 한 구성 요소를 만들었고 그 성능을 테스트하기로되어 있는데 그 이유는 혼란 스럽습니다. –

0

프로파일 링 할 때 새로운 코드를 도입하여 결과에 편향을주지 않는 것이 좋습니다. HPROF으로 문제가 해결되지 않으면 디버거를 사용하고 분석 할 위치 주변에 중단 점을 적용 할 수 있습니다. JProfiler을 시도해 볼 수도 있습니다. 코드에서 한 특정 위치에 집중하는 대신 큰 그림을 먼저 보는 것이 좋습니다. 그렇지 않으면 premature optimization의 위험에 처합니다.

1

InMemProfiler은 메모리 할당을 프로파일 링하는 데 사용할 수 있습니다. 추적 모드에서는이 도구를 identify the source of memory allocations에 사용할 수 있습니다.

옵션 # tracetarget-org.yourcode.YourClass를 사용하여 "클래스 할당"출력을 가져 와서 YourClass에서 메소드 당 메모리 할당을 표시 할 수 있습니다.

그러나 할당 된 클래스별로 메모리 할당을 프로파일 링 할 수만 있습니다. 현재 할당 된 모든 클래스에서 요약이 제공되지 않습니다. 당신이 정말 열정적이라면 InMemProfiler를 포크하고이 기능을 추가해보십시오.

0

oracle jvm을 사용하는 경우이를 수행 할 수 있습니다!

ThreadMXBean threadmx = ManagementFactory.getThreadMXBean(); 
long startbyte = ((com.sun.management.ThreadMXBean)threadmx) 
    .getThreadAllocatedBytes(Thread.currentThread().getId()); 
//call method 
int usedbyte = ((com.sun.management.ThreadMXBean)threadmx) 
    .getThreadAllocatedBytes(Thread.currentThread().getId())-startbyte; 
0

한 가지 방법은 jprofiler 같은 메모리 프로파일 러를 사용하는 것입니다,하지만 당신은 단지 문장의 집합에 의해 사용되는 메모리를보고 싶다면

Runtime runtime = Runtime.getRuntime(); 
long memoryUsedBefore = runtime.totalMemory() - runtime.freeMemory(); 
System.out.println("Memory used before: " + memoryUsedBefore); 
    // set of memory consumption statements here 
long memoryUsedAfter = runtime.totalMemory() - runtime.freeMemory(); 
System.out.println("Total Memory increased:" + (memoryUsedAfter - memoryUsedBefore)); 
관련 문제