2010-02-14 13 views
19

¿Cómo puedo encontrar la cantidad de objetos activos en el montón en el programa Java?Cómo encontrar el número de objetos en el montón

+9

¿Por qué motivo necesita saber la cantidad de objetos de pila en vivo? Es probable que haya una mejor manera de hacer lo que quiera. –

+1

¿Desea obtener esta información desde el propio programa? ¿O usando una herramienta de depuración? –

Respuesta

5

Hay un truco que puede probar:

  • crear su propia java.lang.Object (copiar la fuente original)
  • contar los objetos creados en el constructor (no llamada para arrays)
  • agregar la ruta de acceso al archivo de clase a la ruta de clases de arranque

ver esto (antiguo) article para una muestra.

Probablemente hay mejores maneras de hacerlo usando JPDA o JMX, pero no he encontrado la forma ...

+3

1) Cuidado: este truco * podría * desestabilizar su JVM. 2) No creo que cuente los objetos "creados" al deserializar una secuencia de objetos serializados. (La deserialización predeterminada omite los constructores de objetos.) –

0

Hasta donde yo sé, no se puede. Puede, sin embargo, obtener la cantidad de memoria utilizada por el programa:

Runtime rt = Runtime.getRuntime(); 
System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory()); 
System.out.println("Free: " + rt.freeMemory()); 
System.out.println("Total: " + rt.totalMemory()); 
0

Si todos los objetos son creados usando algún tipo de Factory clase se puede encontrar el número de objetos en el montón. Incluso entonces debes tener algo en el método finalize(). Por supuesto, esto no se puede hacer para todos los objetos, p. las clases de la biblioteca jdk no se pueden modificar. Pero si desea encontrar el número de instancias de una clase en particular que haya creado, puede encontrarlo.

+3

si tengo algo como String a = "abc"; a = a + "def"; Cómo rastreará el número de objetos a través de su fábrica –

0

Para la depuración, puede utilizar un generador de perfiles (como YourKit, un generador de perfiles de java comercial). Encontrará variantes de fuente abierta y comerciales de los perfiles de Java.

Para la integración con su código, puede utilizar la técnica de "Programación Orientada a Aspectos". Los marcos AOP (por ejemplo, AspectWerkz) le permiten cambiar los archivos de clase en el tiempo de carga de la clase. Esto le permitirá modificar constructores para registrar objetos en su "all-my-runtime-objects-framework".

12

jmap es la utilidad java estándar que puede usar para capturar volcados de almacenamiento dinámico y estadísticas. No puedo decir qué protocolo usa jmap para conectarse a la JVM para obtener esta información, y no está claro si esta información está disponible para un programa que se ejecuta directamente en la JVM (aunque estoy seguro de que el programa puede consultar su JVM a través de un socket para obtener esta información).

JVM TI es una interfaz de herramienta utilizada por el código C, y tiene acceso bastante completo a los eventos de la JVM, pero es código C y no está disponible directamente por la JVM. Probablemente puedas escribir una biblioteca en C y luego interactuar con ella, pero no hay nada fuera de la caja.

Existen varios MBeans JMX, pero no creo que ninguno de ellos proporcione un recuento real de objetos. Sin embargo, puede obtener estadísticas de memoria de estos (esto es lo que JConsole usa). Consulte las clases de java.lang.management.

Si quieres un resultado rápido (fácil de implementar, no necesariamente un resultado rápido ya que un jmap toma algo de tiempo), me saltaría una ejecución de jmap y simplemente leeré el archivo resultante.

-1
public class ObjectCount 
{ 
    static int i; 

    ObjectCount() 
    { 
    System.out.println(++i); 
    } 
    public static void main(String args[]) 
    { 
    ObjectCount oc = new ObjectCount(); 
    ObjectCount od = new ObjectCount(); 
    ObjectCount oe = new ObjectCount(); 
    ObjectCount of = new ObjectCount(); 
    ObjectCount og = new ObjectCount(); 
    } 
} 
0
public class NumOfObjects { 

    static int count=0; 
    { 
     count++; 
    } 
    public static void main(String[] args) 
    { 
     NumOfObjects no1=new NumOfObjects(); 
     System.out.println("no1:" + count);//1 

     NumOfObjects no2=new NumOfObjects(); 
     System.out.println("no2:"+ count); //2 
     for (int i=0; i<10;i++) 
     { 
      NumOfObjects noi=new NumOfObjects();  
     } 
     System.out.println("Total objects:"+count);// 12 
    } 
} 
6

Uso jvisualvm, y hacer una muestra de memoria.Se mostrará el número de clases e instancias:

enter image description here

+1

Para aclarar, jvisualvm es parte del Sun JDK (la captura de pantalla elegida puede inducir a error a algunas personas a creer que es parte de IntelliJ). – mikewse

-2
class Test1 
{ 
    static int count=0; 

    public Test1() 
    { 
     count++; 
     System.out.println("Total Objects"+" "+count); 
    } 
} 

public class CountTotalNumberOfObjects 
{ 

    public static void main(String[] args) 
    { 
     Test1 t = new Test1(); 
     Test1 t1 = new Test1(); 
     Test1 t3 = new Test1(); 
     Test1 t11 = new Test1(); 
     Test1 t111 = new Test1(); 
     Test1 t13 = new Test1(); 

    } 

} 
6

La forma más sencilla es utilizar jmap herramienta. Si va a imprimir el histograma de objetos al final, verá el número total de instancias y el tamaño acumulado de todos los objetos:

jmap -histo <PID> imprimirá objetos enteros con número de instancias y tamaño. La última línea contiene número total

Total 2802946 174459656

segunda columna se cuentan casos totales, y la última es el total de bytes.

Cuestiones relacionadas