9
votes

Peut-on voir des objets dans la mémoire JVM?

Au travail, nous avons constaté que sur certains cas (particulièrement les lents), nous avons un comportement différent, acquis au redémarrage.

Nous devinons qu'un cache n'est pas initialisé correctement, ou peut-être un problème de concurrence ... Quoi qu'il en soit, il n'est pas reproductible dans aucune autre envusion que la production.

Nous n'avons réellement pas d'enregistreurs pour activer ... c'est un ancien composant ...

Ainsi, j'aimerais savoir s'il existe des outils pouvant nous aider à voir les différents objets présents dans la mémoire JVM afin de vérifier le contenu du cache ...

Merci!

EDIT:

Je n'ai pas accès aux serveurs de production directement, notre serveur d'applications est Weblogic 10, je n'ai pas de pointeur sur l'objet mais je connais le type d'objet cache ...

Edit2:

Nos serveurs sont en cours d'exécution sur JRE 1.5, est-il possible d'utiliser jmap? Vous ne pouvez pas le trouver dans un JDK5 :( En outre, le débogage à distance pourrait être agréable, mais nous ne pouvons pas pour des raisons de sécurité ...

Edit3:

En réalité, Jhat + Visualvm est ok pour moi, j'ai trouvé mon objet en vidage mais je ne suis pas en mesure de lire le hashmap (objet contenant environ 60000 articles) correctement ... Y a-t-il un outil pour lire une Concourshashmap de manière amicale? J'ai besoin de trouver la valeur d'une clé (ou de son existence sur la carte) sans naviguer manuellement les enregistrements 60k. En fait, j'ai lu sur l'Eclipse Mat Forum que ce n'est pas non plus possible avec elle ...

Edit4: Après quelques expériences, j'aime vraiment des outils comme Visualvm. Aussi utilisé votrekit. Il existe certaines fonctionnalités utiles telles que OQL pour trouver les bonnes instances que vous devez regarder ...


1 commentaires

Je ne sais pas d'un moyen d'accéder à l'objet sans avoir une sorte de pointeur / référence variable.


3 Réponses :


3
votes

Avez-vous accès à une poignée / pointeur sur les objets? Si tel est le cas, vous pouvez le déclencher en mode de débogage et le regarder dans un débogueur comme Eclipse. Cela vous permettra d'inspecter les variables et autres.

Alternativement, vous pouvez écrire un petit enregistreur qui se promène réfléchi par la classe et les journaux ce qui se passe. Tout cela suppose que vous avez un emplacement où vous pouvez commencer à entrer dans le code ou que vous pouvez faire référence aux valeurs en cache. P>


EDIT: Comme je l'ai noté dans mon commentaire, je ne sais pas Connaissez un moyen d'accéder à un objet sans une sorte de référence ou de lien de références. Par exemple, l'objet est-il encapsulé dans un autre objet? Si tel est le cas, vous pouvez faire quelque chose comme ce qui suit: P>

Field targetField = objectClass.getDeclaredField("myFieldName");
targetField.setAccessible(true);
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer);
//do whatever you need to do here


6 commentaires

Je ne pense pas qu'un débogueur comme celui-ci présent dans Eclipse est une option car "ce n'est pas reproductible dans aucune autre envusion à la production."


@Andrew Hubbs: J'ai utilisé personnellement le débogage Eclipse dans un environnement de production - vous devez démarrer le système en mode débogage et le configurer à distance de connexion à distance. Il y a des options là-bas - ce n'est pas facile, mais c'est possible.


Nos serveurs ne sont pas dans la même ville, je ne sais pas s'ils peuvent démarrer une production Web de production en mode de débogage, et ne sais pas non plus si elles me donnent accès à un tunnel ...


@Sebastien Lorber: Je suggérerais d'utiliser la suggestion de @will Hartung alors - vous pouvez obtenir un tas de tas, puis l'analyser avec les différents outils suggérés. Tout comme un fyi - la première fois que j'ai vu une séance de débogage à distance, c'était également des serveurs dans une autre ville. C'est possible - mais cela ressemble à ce que le heatpdump serait une meilleure option pour vous.


C'est oui à coup sûr de déboguer sur des serveurs distants tous les jours, mais ils ne me donneraient jamais accès à une instance de production ...


@Sebastian Lorber: Je peux comprendre cela - les rares fois où j'ai été impliqué dans cela, cela a été des cas très spécialisés, où nous n'avons pas été incapables de comprendre ce qui n'allait rien d'autre, et tout a été fait par notre groupe informatique interne afin Ils pouvaient s'en sortir dessus.



4
votes

Il est assez facile d'exécuter JMAP pour vider un nombre d'instances d'objet, mais je ne sais pas si c'est ce dont vous êtes vraiment intéressé.

Vous pouvez également utiliser JMAP pour faire un vidage de tas de tout le tas, et avec celui-ci (et Jhat), vous pouvez voir des relations d'objet (c'est-à-dire quel objet pointe sur quoi), mais pas nécessairement le contenu de l'objet.

Certainement, les données sont là dans la décharge de tas, ce n'est pas "clic" visible.

Certains des profileurs professionnels, je pense vous laisseront intriguer des objets dans un dépotoir de tas.

Otlewise, vous feriez mieux d'ajouter une instrumentation spécifique à l'application pour fournir l'introspection spécifique que vous recherchez, déclenchée par le code personnalisé, JMX ou autre.


2 commentaires

+1 - Je ne savais pas le dépotoir du tas. Cela aurait été vraiment utile un mois ou deux pour moi :)


Nous utilisons Java 1.5 est-il possible d'utiliser jmap sur un 1,5 jre? J'ai trouvé JMAP uniquement sur JDK6 et cela ne pouvait pas fonctionner avec mon JRE 1.5 ...



8
votes

Ceci est essentiellement pour développer ce qui aura dit. J'ai eu beaucoup de succès en demandant aux administrateurs de nos systèmes de production de nos systèmes de production, bien que la mise en garde que le serveur particulier que vous sortez du dumping soit non réactif jusqu'à ce que le dépotoir soit terminé. Ensuite, obtenez ce fichier et en utilisant le plugin Eclipse Mat pour l'examiner. Si vous n'aimez pas Eclipse, Netbeans et le plug-in uni VisualvM peuvent également être utilisés. Cela peut cependant créer de gros fichiers, vous devrez peut-être fonctionner sur un système 64 bits.


1 commentaires

+1 pour Eclipse Tapis - imo le visualiseur de tas (gratuit) le plus puissant (gratuit). Hautement recommandé et a des plugins géniaux pour regarder le tas de manière intéressante (collection remplissage%, par exemple!).