2010-09-21 5 views
7

¿hay alguna manera de imprimir las clases N usadas superiores en la aplicación java actual programáticamente?Imprimir el histograma de clase programáticamente

salida de ejemplo: N = 10

num #instances #bytes class name 
-------------------------------------- 
    1:  23  4723136 [I 
    2:  19  4718928 [J 
    3:  18  4718880 [D 
    4:  73925  1774200 java.lang.String 
    5:  208  1226400 [C 
    6:  28  1205064 [B 
    7:  18  1179936 [F 
    8:  68  297040 [Ljava.lang.String; 
    9:  332  14136 [Ljava.lang.Object; 
10:  32  10240 <objArrayKlassKlass> 
+0

El perfilador de Netbeans lo hace muy bien, Netbeans está escrito en Java, así que ... Sí, hay una forma =) ¡Aquí tienes! – BenoitParis

+0

¿Qué quiere decir con "top used"? ¿Las clases con la mayor cantidad de instancias en un punto dado en el tiempo o totales durante la vida útil de la aplicación? ¿O quizás te refieres a las clases cuyos métodos se invocan más? (Medición basada en el tiempo o conteo de llamadas) –

+0

¿Qué es [J? [I es una matriz de números enteros, pero J? –

Respuesta

0

Probablemente no sin pasar por JVM Tool Interface (JVM TI) o la manipulación de la aplicación del objeto (que es un negocio difícil).

Este artículo es quizás útil: Creating a Debugging and Profiling Agent with JVMTI.

+0

gracias por los comentarios. Creo que usar jmap source puede ser una buena opción ... es arriesgado en el entorno en vivo ... http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/tools/sun/tools /jmap/JMap.java.htm – Trustin

0

Si se refiere a la parte superior utilizada, las clases que se inicializan más, puede definir un punto de corte alrededor de los constructores y realizar un seguimiento de las inicializaciones para cada tipo. Puedes usar AspectJ para ese asunto.

+0

Quiero hacer lo mismo con jmap -histo [: live] pid sin cambiar nuestro programa. porque el sistema es en vivo No quiero agregar sobrecarga agregando tales cortes de punto. Tampoco puedo confiar en el método de finilizer para disminuir el conteo. – Trustin

+0

, por lo tanto, si desea ver el número de instancias en un punto determinado, pensé que deseaba ver el número total de instancias creadas. Entonces creo que lo que necesitas es una API de creación de perfiles. Puede consultar el paquete java.lang.management pero no estoy seguro de si es posible obtener el conteo de instancias – hakan

0

No creo que pueda hacerlo dentro de la misma JVM porque necesita atravesar el montón de objetos, y puede terminar yendo en un ciclo infinito. Solo por curiosidad, intenté engendrar jmap usando Runtime.exec contra la misma JVM e incluso contra una JVM diferente y simplemente se cuelga?

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; 
//pid=2520 
System.out.println("PID: " + pid); 
Process p = Runtime.getRuntime().exec("jmap -histo " + pid); 
p.waitFor(); 
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line ; 
while((line = br.readLine())!=null){ 
    System.out.println(line); 
} 

br = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
while((line = br.readLine())!=null){ 
    System.out.println(line); 
} 
3

Se podría poner en marcha jmap como parte de su guión envoltorio Java y ejecutarlo de forma continua en un bucle:

Por ejemplo, si usted está en Unix, se podría hacer algo como:

java MyMainClass ... & 

pid=$! 
while [ ! -z $pid ] 
do 
    jmap -histo $pid | head -13 
    sleep 60 

    #check pid 
    kill -0 $pid > /dev/null 2>&1 
    if [ $? -ne 0 ] 
    then 
     pid="" 
    fi 
done 
Cuestiones relacionadas