2009-12-22 9 views
16

Actualmente estoy trabajando en un agente de Java para ensamblar estadísticas de memoria. Con la ayuda del instrumentation API puedo obtener las clases (y manipularlas). Con Java simple, puedo obtener una estimación de los recursos utilizados para cada objeto. Hasta aquí todo bien.¿Existe una manera simple de obtener todas las instancias de objeto de una clase específica en Java

La pregunta que me enfrenta ahora es "cómo obtener una boleta de cada instancia de objeto de una clase específica". Puedo hacer una manipulación de código de bytes para obtener la instancia del objeto, pero esperaba que hubiera otra API de la que no estoy enterado, ayudándome a lograr mi objetivo sin un paso intrusivo tan pesado. Al final, el impacto en el rendimiento debe mantenerse al mínimo. ¿Algunas ideas?

Respuesta

20

El depurador de Eclipse puede show you all the instances of a class, así que busqué alrededor de las fuentes de Eclipse. Eclipse usa el Java Debug Wire Protocol, que le permite (desde Java 6) buscar todas las instancias de la clase solicitada. Si desea seguir este camino, obtenga una copia de las fuentes de Eclipse y consulte el método instances de org.eclipse.jdi.internal.ReferenceTypeImpl.

Una manera más simple es usar el Java Debug Interface. Tenga en cuenta el método ReferenceType.instances.

Todavía no he descubierto cómo usar JDI para conectarme a un proceso en ejecución y cómo obtener una instancia de ReferenceType. El JDK contiene varios examples, así que estoy seguro de que es factible.

0

Según lo que me han dicho en publicaciones anteriores, no hay forma de obtener una lista de todas las instancias de una clase en Java. La API de reflexión hace algunas cosas ordenadas, pero no esta cosa específica.

Lo mejor que puede hacer es mantener punteros a todos los objetos, pero parece obsceno y no funciona en los programas de otras personas. No es ideal, ¿eh?

+4

Mantener punteros no es realmente tan obsceno si lo haces con WeakReferences (http://java.sun.com/javase/6/docs/api/java/lang/ref/WeakReference.html). –

4

Cuando leí esto, estaba pensando que debe haber ALGUNA forma de obtener este tipo de información, ya que existen los perfiles de Java. Tal vez esto ayude: http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html. Describe la interfaz entre la JVM y un agente de perfilador. Pero si realmente desea escribir esto en Java, puede que no tenga suerte.

Específicamente, echa un vistazo a esta función:

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 ha sido reemplazado por JVMTI (http://java.sun.com/javase/6/docs/technotes/guides/jvmti/index.html) - pero +1 para leer el OP y responder con la interfaz de la herramienta – kdgregory

+0

+1 para hacerlo más relevante :) – danben

1

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

Puede escribir código nativo que obtiene el puntero JVMTI y luego lo utiliza para iterar sobre todas las instancias de una clase dada, como se muestra en el siguiente enlace. Puede llamar a este código nativo desde su programa Java. Como señala Eli, existe un envoltorio de alto nivel para esta llamada interfaz de depuración de Java, disponible desde Java 6 en adelante, que le permite realizar llamadas desde Java sin necesidad de perder el código nativo.

esperanza esto ayuda

Ram

1

Me pregunto si lo que está tratando de hacer que podría llevarse a cabo utilizando BTrace?

Cuestiones relacionadas