2016-02-13 1 views
4

Cela peut être une vue longue d'une question, mais j'ai rencontré un problème très compliqué et je ne sais pas comment le résoudre. En bref, une application Java est en cours d'exécution. Elle utilise actuellement JDBC pour extraire des données d'une base de données MySQL au démarrage.Exporter des données à partir de JVM en cours d'exécution?

Nous avons eu une fusion et cette base de données n'est plus active et a été perdue pour toujours, de même que les données qui vont avec, ce qui est très précieux en interne.

Cependant, les données sont toujours stockées dans le tas de la machine virtuelle Java en cours d'exécution qu'il a tiré dans.

Mon seul espoir est maintenant d'extraire en quelque sorte les données de la machine virtuelle Java en cours d'exécution, dans un monde idéal, je serais en mesure de y joindre et ont la possibilité d'exécuter du code qui pourrait accéder aux cours de fonctionnement interne ..

Mes questions sont aujourd'hui:

  • est mon approche raisonnable et possible?
  • Si oui, comment puis-je joindre à la machine virtuelle Java et le code « Injecter »

Merci de lire

+1

Vous connaissez l'API attacher? Et des décharges de tas? –

+1

Voir [Comment obtenir un vidage de threads et de tas d'un processus Java sous Windows qui ne s'exécute pas dans une console] (http://stackoverflow.com/questions/407612/how-to-get-a-thread-and-heap -dump-d'un-java-process-on-windows-thats-not-runnin). – saka1029

Répondre

0

Il semble que ce que vous voulez utiliser est la commande jmap. jmap peut être utilisé pour vider le tas d'une JVM en cours dans un fichier, que vous pouvez ensuite analyser "hors ligne", en utilisant des outils tels que jhat ou JVisualVM. Cela vous permet de le faire sans tuer la JVM et/ou d'y injecter du code, et puisque le fichier de vidage de tas est "inerte", vous pouvez l'analyser à votre guise sans craindre de blesser la VM en cours d'exécution. plus loin. Certes, je ne l'ai pas beaucoup utilisé, donc je ne sais pas exactement quelles sont ses capacités, mais théoriquement, vous pourriez aussi utiliser le langage OQL de JVisualVM pour exécuter des séquences automatisées sur les données dans le tas et le vider dans un format tu veux. Voir, par exemple, this question pour des exemples d'utilisation.

0

Dans une situation comme celle-ci, le Eclipse Memory Analyzer Tool peut être une bonne solution. Il fonctionne aussi sur les dumps de tas et vous montre quels objets occupent la mémoire. En plus de cela, il peut afficher le contenu des objets/emplacements de mémoire.

je trouve parfois MAT va au-delà ce que VisualVM fait, mais peut-être une vue comme celui-ci vous aide à trouver vos données déjà:

enter image description here

(Ceci est une capture d'écran d'un exemple maquillé où je crée certains objets personnalisés dans pour les afficher avec leur valeur dans le tas)

Vous pouvez même joindre Eclipse à l'application en cours d'exécution. Il y a une certaine astuce où vous pouvez exécuter du code personnalisé dans un point d'arrêt. Celui-ci pourrait en quelque sorte vider vos données sur le disque.