Existe-t-il un moyen simple d'obtenir toutes les instances d'objets d'une classe spécifique en Java?
Je travaille actuellement sur un projet Java agent pour assembler la mémoire stats. Avec l'aide de la l'instrumentation de l'API je peux obtenir une prise de les classes (et manipuler). Avec la plaine de Java, je peux avoir une estimation des ressources utilisées pour chaque objet. Pour l'instant, donc bon.
La question, je suis confronté à droite maintenant, c'est "comment obtenir une prise de tout Objet instance d'une classe spécifique". Je peux faire du byte-code de la manipulation afin d'obtenir une prise de l'instance de l'objet, mais j'espérais qu'il y est une autre API, je ne suis pas au courant de, de m'aider à accomplir mon objectif sans une assez lourde intrusive étape. À la fin, l'impact sur les performances devraient être maintenus à un minimum. Des idées?
source d'informationauteur Mirko Jahn
Vous devez vous connecter pour publier un commentaire.
Le débogueur dans Eclipse peut vous montrer toutes les instances d'une classealors j'ai regardé autour de l'Éclipse de sources. Eclipse utilise le Java Debug Fil De Protocolequi vous permet (depuis Java 6) pour rechercher toutes les instances de la classe demandée. Si vous voulez aller dans cette voie, de récupérer une copie de l'Éclipse de sources et de vérifier les
instances
méthode deorg.eclipse.jdi.internal.ReferenceTypeImpl
.Une façon plus simple est d'utiliser le Java Debug Interface. Remarque le
ReferenceType.les instances
méthode.Je n'ai toujours pas compris comment utiliser JDI pour se connecter à un processus en cours d'exécution et comment faire pour obtenir une instance de
ReferenceType
. Le JDK contient plusieurs exemplesdonc je suis sûr que c'est faisable.Quand j'ai lu cela, je pensais qu'il doit y avoir un moyen d'obtenir ce genre d'info, depuis java profileurs existent. Peut-être que cela aidera à: http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html. Il décrit l'interface entre la JVM et un profileur de l'agent. Mais si vous étiez à la recherche d'écrire cela en Java, vous pouvez être hors de la chance.
Plus précisément, découvrez cette fonction:
http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html#IterateOverInstancesOfClass
Vous pouvez écrire du code natif qui obtient le JVMTI pointeur, puis l'utilise pour
parcourir toutes les instances d'une classe donnée, comme indiqué dans le lien ci-dessus.
Vous pouvez appeler ce code natif à partir de votre programme Java.
Comme Eli souligne que, il ya un niveau élevé de wrapper pour cela appelé Java Debug Interface disponible à partir de la version 6 de Java suivantes, ce qui permet de faire de tels appels à partir de Java lui-même sans avoir à muck autour avec du code natif.
espère que cette aide
Ram
Je me demande si ce que vous essayez de le faire peut être accompli en utilisant BTrace?
De ce que j'ai dit dans les messages précédents, il n'y a aucun moyen d'obtenir une liste de toutes les instances d'une classe en Java. L'API reflection n'bien des choses, mais pas cette chose spécifique.
La meilleure chose que vous pouvez faire est de maintenir des pointeurs vers tous les objets, mais qui semble obscène et ne fonctionne pas sur d'autres programmes. Pas l'idéal hein?