9
votes

Histogramme de classe d'impression par programme

Y a-t-il un moyen d'imprimer les classes N TOP utilisées sur l'application Java actuelle Programmatiquement?

Sortie d'échantillon: N = 10 P>

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>


3 commentaires

Netbeans Le profileur le fait bien, Netbeans est écrit en Java, alors ... oui il y a un chemin =) Vous y allez!


Que voulez-vous dire par "Top utilisé"? Les classes avec le plus grand nombre d'instances à un point donné à temps ou au total sur la durée de vie de l'application? Ou peut-être que vous voulez dire les classes dont les méthodes sont les plus invoquées? (Mesure basée sur la mesure ou mesure du nombre d'invocations)


Qu'est-ce que [J? [Je suis un tableau d'entier, mais j?


5 Réponses :


0
votes

Probablement pas sans passer par Interface d'outil JVM (JVM TI) ou altération de la mise en œuvre de l'objet (qui est une entreprise délicate).

Cet article est peut-être utile: Création d'un agent de débogage et de profilage avec JVMTI .


1 commentaires

Merci pour des commentaires. Je pense que l'utilisation de la source JMAP peut être une bonne option. C'est risqué sur l'environnement en direct .. JAVA2S.COM/OPEN-SOURCE/JAVA-DOCULATION/6.0-JDK-MODULES-SUN/TOO LS / ...



0
votes

Si vous voulez dire par le haut utilisé, classes les plus initialisées, vous pouvez définir un point de pointe autour des constructeurs et garder une trace des initialisations pour chaque type. Vous pouvez utiliser AspectJ pour cette affaire.


2 commentaires

Je veux faire la même chose avec Jmap -histo [: Live] PID sans changer notre programme. parce que le système est en direct. Je ne veux pas ajouter des frais généraux en ajoutant de tels points CUTS.Aso Je ne peux pas faire confiance à la méthode du finilizer pour décrémenter le compte.


Vous voulez donc voir le nombre d'instances à un moment donné, je pensais que vous vouliez voir le nombre total d'instances créées. Ensuite, je pense que ce dont vous avez besoin est une API de profilage. Vous pouvez vérifier java.lang.management package mais je ne suis pas sûr s'il est possible d'obtenir des comptes d'instance



0
votes

Je ne pense pas que vous puissiez le faire dans le même JVM, car vous devez traverser le tas d'objets, et vous pourriez vous retrouver dans une boucle infinie. Juste hors de curiosité, j'ai essayé de frai jmap code> à l'aide de runtime.exec code> contre le même JVM et même contre un autre jvm et il se bloque simplement?

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);
}


1 commentaires

Le problème est que vous attendez que le processus finisse sans lire le flux en premier. Il y a une taille de tampon limitée, vous devez donc la consommer en premier. J'ai ajouté une réponse couvrant ceci: Stackoverflow.com/a/58224879/3645944



3
votes

Vous pouvez lancer jmap dans le cadre de votre script java wrapper et exécuté continuellement dans une boucle:

Par exemple, si vous êtes sur UNIX, vous pouvez faire quelque chose comme: xxx


0 commentaires

0
votes

Vous pouvez utiliser exécutant # exécuté programmatisé pour exécuter un jmap comme ceci: xxx

et la sortie sera: xxx


0 commentaires