2012-01-24 1 views
0

프로그램 실행 중 객체가 사용되는시기와 횟수를 알고 싶습니다. 이를 위해 JVM 스택에 액세스해야합니까? 그렇지 않을 수도 있습니다.JVM 스택 액세스

+0

도움이 희망이라고 생각? – casablanca

+0

개체 해시를 호출 할 때 모든 메서드와 생성자를 로깅 할 수 있습니까? –

답변

6

이렇게하려면 프로파일 러를 사용해야합니다. YourKit 또는 JProfiler 또는 VisualVM과 같은 것입니다.

+0

+1, VisualVM에는 JDK> = 1.6이 번들로 제공됩니다. – quaylar

1

"개체가 몇 번 사용되고 있습니까?"라는 것은 무엇을 의미합니까? 생성자가 몇 번이나 호출 되었습니까? 또는 객체의 메소드가 몇 번 호출 되었습니까? 분명히하십시오 ...

어쨌든, 그것을 할 수있는 몇 가지 방법이 있습니다.

  1. 당신은 당신의 마음에 드는 프로파일 러를 사용할 수 있습니다, 난 당신이 "추적"모드 (계측을 수행하는 모드, 그리고 샘플링 모드)를 사용해야합니다 생각합니다.

  2. 클래스를 재 컴파일하는 것은 당신이이 다음을 수행 할 수있는 것보다 옵션의 경우 : 말, 당신은 몇 가지 constuctors와 클래스 푸 있습니다

    공용 클래스 푸 {

    공공 푸 (I를 INT) {

     // some constructor 
    

    }

    공공 푸 (문자열들) { // 다른 생성자,}

    }

말, 당신은

그래서, 당신은 정적을 사용할 수 있습니다 (즉, 개체가 생성 된 횟수입니다) 당신의 생성자가 호출 한 횟수 알고 싶어 데이터 멤버를 만들고 생성자를 호출 할 때마다 카운트를 증가시킵니다. 이처럼 :

public class Foo { 
    private static int count = 0; 

    public Foo(int i) { 

    // if we're here, the object is being created now: 
    count++; 
    ..... 
    } 
    ... 
} 

은 그럼 당신은 생성 된 덤프가 좋아하는 프로파일을 다시 jhat에 의해 또는 열 수 있습니다 (JAVA_HOME/bin에있는 jmap을 함께 예를 들어) 힙의 스냅 샷을 할 수 있으며 다음과 같은 작업을 할 수 있습니다 객체 상태를 탐색하여 확인하십시오.

물론이 방법은 메소드 호출에도 적용됩니다. 실제로 동일한 클래스 로더에 의해 객체가 생성되는 한 계속 작동합니다. 당신 3.If는

는 악기 당신이 있습니다, 여기에 AspectJ를 같은 프레임 워크를 사용하여 고려할 수 2와 같은 효과를 달성하기 위해 당신의 바이트 코드를 할 수있는, 프로파일 러를 사용하고자하지 않을 여전히 코드를 다시 컴파일 할 수는 없지만 다른 사람의 많은 ...

나는 프로파일이 가장 빠른 방법은 여기에서이 작업을 수행하여 측정하려고하는 이것이