2009-09-05 4 views
3

Je voudrais obtenir une référence à tous les objets dans le tas Java, même si je n'ai pas immédiatement une référence à ces objets dans mon thread actif. Je n'ai pas besoin d'objets non référencés (ceux "mis en file d'attente" pour la récupération de place), mais je voudrais obtenir tout ce qui est encore utilisé.Comment puis-je accéder aux objets de segment Java sans référence?

Le but est de sérialiser et stocker tous les objets pour implémenter la persistance d'un état d'exécution pauvre. Je me rends compte que le trou de lapin devient profond quand il s'agit de différents types d'états transitoires, mais simplement des objets persistants & des définitions de classe chargées me seraient utiles.

Existe-t-il un moyen d'accéder au tas pour que cela se produise? Est-ce que je néglige une approche plus directe?

+0

Cherchez-vous à obtenir une décharge de tas? Ou voulez-vous également accéder à la génération permanente? –

+0

Je m'intéresse principalement à l'accès aux objets du tas (par programmation!). Le PermGen me donnerait les définitions de classe, qui sont aussi intéressantes, mais j'essaie de garder ma question centrée. :-) – Greg

Répondre

3

Je regardais dans le paquet instrument. Instrumentisez les classes qui vous intéressent afin que le ctor enregistre l'instance créée. Vous pourriez être capable de le faire via AspectJ si vous ne voulez pas utiliser le java.lang.instrument ou si les objets sont créés via quelque chose que vous pouvez contrôler (un conteneur ou des usines IoC) alors vous pouvez faire quelque chose d'un bon morceau moins magique.

+0

J'aime cette approche, car elle me donne un bon crochet pour travailler avec les objets. Merci. – Greg

0

Je vous suggère de prendre un heap dump puis de l'inspecter en utilisant the Eclipse Memory Analyser.

Les vues disponibles vous permettent d'accéder au niveau de l'instance et de voir les propriétés de l'objet. Vous pouvez même interroger des objets en utilisant OQL - et un langage de requête de type SQL pour les objets.

Le panneau de gauche de la capture d'écran ci-dessous illustre l'inspection des valeurs de champ.

screenshot http://img181.imageshack.us/img181/4013/dominatortreegrouped.png

+0

Je suppose qu'il voulait accomplir cela via le code. – MattC

+0

Encore, c'est plutôt cool. Je vais devoir vérifier. – MattC

+1

D'accord avec MattC - c'est assez cool et quelque chose que je veux vérifier, mais je suis principalement intéressé par la façon de le faire via le code dans la même JVM. – Greg

1

Si vous souhaitez effectuer un vidage de tas par programme, vous ne trouverez pas d'API appropriées dans l'espace de noms java. * Ou javax. *. Cependant, le moteur d'exécution Sun est livré avec le HotSpotDiagnosticMXBean qui vous permettra d'effectuer un vidage de tas en écrivant le contenu du tas sur un fichier spécifié sur le disque.

Questions connexes