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>
5 Réponses :
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). p>
Cet article est peut-être utile: Création d'un agent de débogage et de profilage avec JVMTI . P>
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 / ...
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. P>
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
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);
}
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
Vous pouvez lancer Par exemple, si vous êtes sur UNIX, vous pouvez faire quelque chose comme: p> jmap code> dans le cadre de votre script java wrapper et exécuté continuellement dans une boucle:
Vous pouvez utiliser et la sortie sera: p> exécutant # exécuté code> programmatisé pour exécuter un
jmap code> comme ceci:
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?