2009-12-22 2 views
16

현재 Java 통계를 수집하기 위해 Java 에이전트에서 작업 중입니다. instrumentation API의 도움으로 나는 수업을 듣고 (그리고 조작 할 수 있습니다.) 평범한 Java를 사용하면 각 객체에 대해 사용 된 예상 리소스를 얻을 수 있습니다. 여태까지는 그런대로 잘됐다.Java에서 특정 클래스의 모든 객체 인스턴스를 가져 오는 간단한 방법이 있습니까

내가 직면 한 질문은 "특정 클래스의 모든 Object 인스턴스를 얻는 방법"입니다. 나는 객체 인스턴스를 잡기 위해 바이트 코드 조작을 할 수 있지만, 내가 알지 못하는 또 다른 API가 있기를 바래서, 그렇게 무거운 관입 단계없이 내 목표를 달성하도록 도와 주었다. 결국 성능에 미치는 영향을 최소화해야합니다. 어떤 아이디어?

답변

20

디버거는 show you all the instances of a class 할 수있는, 그래서 이클립스의 소스를 둘러 보았다 :

은 특히,이 기능을 확인하십시오. Eclipse는 Java Debug Wire Protocol을 사용하여 (Java 6부터) 요청 된 클래스의 모든 인스턴스를 조회 할 수 있습니다. 이 경로로 이동하려면 Eclipse 소스 사본을 잡고 메소드가 org.eclipse.jdi.internal.ReferenceTypeImpl인지 확인하십시오.

더 간단한 방법은 Java Debug Interface을 사용하는 것입니다. ReferenceType.instances 메소드에 유의하십시오.

JDI를 사용하여 실행중인 프로세스에 연결하는 방법과 ReferenceType 인스턴스를 얻는 방법을 아직 알지 못했습니다. JDK에는 여러 개의 examples이 포함되어 있으므로 수행 할 수 있다고 확신합니다.

0

이전 게시물에서 들었던 것부터 Java의 모든 클래스 인스턴스 목록을 가져올 방법이 없습니다. 리플렉션 API는 깔끔한 일을하지만이 특정 작업은 수행하지 않습니다.

당신이 할 수있는 최선의 일은 모든 객체에 대한 포인터를 잡는 것입니다.하지만 그것은 외설스럽고 다른 사람들의 프로그램에서는 작동하지 않습니다. 이상적이지 않니?

+4

WeakReferences (http://java.sun.com/javase/6/docs/api/java/lang/ref/WeakReference.html)를 사용하면 지주 포인터가 실제로 외설스럽지 않습니다. –

4

이 글을 읽었을 때 자바 프로파일 러가 존재하기 때문에 이런 종류의 정보를 얻는 방법이 필요하다고 생각했습니다. 아마도 이것은 도움이 될 것입니다 : http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html. JVM과 프로파일 러 에이전트 간의 인터페이스를 설명합니다. 그러나 실제로 Java에서이 글을 쓰고 싶다면 운이 좋지 않을 수 있습니다. Eclipse에서

jint (*EnableEvent)(jint event_type, void *arg); 

    Called by the profiler agent to enable notification of a particular type of event. Apart from event_type, the profiler may also pass an argument that provides additional information specific to the given event type. 

    All events are disabled when the VM starts up. Once enabled, an event stays enabled until it is explicitly disabled. 

    This function returns JVMPI_NOT_AVAILABLE if event_type is JVMPI_EVENT_HEAP_DUMP, JVMPI_EVENT_MONITOR_DUMP or JVMPI_EVENT_OBJECT_DUMP. The profiler agent must use the RequestEvent function to request these events. 

    Arguments: 

     event_type - type of event, JVMPI_EVENT_CLASS_LOAD etc. 
     arg  - event specific argument. 

    Returns: 

     JVMPI_SUCCESS enable succeeded. 
     JVMPI_FAIL enable failed. 
     JVMPI_NOT_AVAILABLE  support for enabling the given event_type is not available. 
+2

JVMPI가 JVMTI (http://java.sun.com/javase/6/docs/technotes/guides/jvmti/index.)로 대체되었습니다.HTML) -하지만 +1 실제로 OP를 읽고 도구 인터페이스를 사용하여 응답 – kdgregory

+0

+1 더 많은 관련성을 만들기위한 다시 :) – danben

1

http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html#IterateOverInstancesOfClass

당신은 JVMTI 포인터를 가져옵니다 일부 네이티브 코드를 작성할 수 있습니다 위의 링크에서와 같이 다음 해당 클래스의 모든 인스턴스에 걸쳐 반복을 사용합니다. Java 프로그램에서이 원시 코드를 호출 할 수 있습니다. Eli가 지적했듯이, 자바 6 이후부터 사용할 수있는 자바 디버그 인터페이스라는 고급 래퍼가 있습니다. 네이티브 코드를 사용하지 않고도 Java에서 이러한 호출을 수행 할 수 있습니다.

희망이

램이 BTrace을 사용하여 수행 할 수 있습니다 뭘 하려는지 궁금

관련 문제