Question

En écrivant un profilage, j'implémenterais également la tâche typique de profilage de tas.Plus précisément, je voudrais suivre, quel thread a alloué combien de données?En utilisant JVMTI, j'ai pensé qu'il était suffisant de se connecter aux événements VM Object Allocation et Object Free .Malheureusement, j'ai lu que le premier événement n'est pas déclenché en raison d'appels effectués à new.

La dernière idée que j'ai eue était de vérifier l'événement MethodExit si son nom est <init> et donc de déclarer cet appel comme une allocation d'objet.Cependant, dans cet événement, je ne peux pas obtenir l'objet et donc je ne peux pas invoquer GetObjectSize.

Une simple itération sur le tas ne porte aucune information sur quel objet a été alloué par quel thread.Quelqu'un a-t-il une idée de la façon de mettre en œuvre cela?

Était-ce utile?

La solution

Y a-t-il une raison pour laquelle vous ne pouvez pas appeler GetObjectSize depuis l'événement MethodEntry pour un constructeur?

Si vous souhaitez exécuter du code avant le retour d'une méthode, vous pouvez écouter l'événement MethodEntry, et si la méthode est nommée <init>, vous pouvez appeler NotifyFramePop pour écouter l'événement FramePop pour la trame actuelle.Cet événement est similaire à l'événement MethodExit, mais se produit avant le retour de la méthode afin que vous puissiez toujours obtenir l'objet this.

Autres conseils

Un rapide coup d'œil sur la _new implémentation de la VM Hotspot (templateTable_x86_64.cpp) semble indiquer que _new n'offre aucun hook pour JVMTI (pas même dans le cas lent il semble).Donc, si votre astuce ne fonctionne pas, je ne vois aucune autre possibilité - mais je ne suis en aucun cas un expert en JVMTI.

Je suppose que compiler votre propre VM Hotspot avec un petit patch n'est pas particulièrement utile pour vous?

Cette démo heapTracker vous montre commentsuivre tous les objets du tas. Parce que l ' événement VMObjectAlloc n'est envoyé qu'en cas de réflexionse produit, la démonstration utilise ByteCodeInstrument pour suivre la nouvelle allocation d'objets.


Vous pouvez utiliser la fonction getCurrentThread pour savoir à quel thread appartient l'objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top