2016-02-13 4 views
4

Это может быть длинный вопрос, но я столкнулся с очень сложной проблемой, и я не уверен, как ее решить.Экспортировать данные из запущенной JVM?

Короче говоря, у нас есть приложение Java, которое в настоящее время использует JDBC для загрузки данных из базы данных MysQL при запуске.

У нас был кризис, и эта база данных больше не активна и была потеряна навсегда, и поэтому у нее есть данные, которые вместе с ней будут очень ценными.

Однако данные по-прежнему хранятся в куче бегущего JVM, что вытащил его.

Моя единственная надежда теперь, чтобы каким-то образом извлечь данные из текущей виртуальной машины Java, в идеальном мире я бы смог прикрепить к нему и иметь гибкость для запуска кода, который может получить доступ к внутренним классам погонных ..

Так мои вопросы сегодня являются:

  • Является ли мой подход разумным и возможным?
  • Если да, то как я могу прикрепить к JVM и код «Inject»

Спасибо за чтение

+1

Вы знаете API-интерфейс приложения? А из кучи свалки? –

+1

См. [Как получить поток и кучу процесса Java в Windows, который не работает в консоли] (http://stackoverflow.com/questions/407612/how-to-get-a-thread-and-heap -dump-оф-а-Джава-процесс-на-Windows-THATS-не-протекающей). – saka1029

ответ

0

кажется, что то, что вы хотите использовать команду jmap. jmap можно использовать для сброса кучи работающего JVM в файл, который затем можно анализировать «off-line», используя такие инструменты, как jhat или JVisualVM.

Это позволяет сделать это, не убивая JVM и/или вводящий код в него, а так как файл дампа кучи является «инертным», вы можете анализировать его на досуге, не опасаясь вредить запущенной виртуальной машине, исследуя его в дальнейшем. По общему признанию, я не использовал его широко, поэтому я не уверен точно, каковы его возможности, но теоретически вы, возможно, также можете использовать язык OQL языка JVisualVM для запуска автоматических последовательностей данных в куче и выгрузки их в файлы в формате вы хотите.

См., Например, this question для использования.

0

В такой ситуации Eclipse Memory Analyzer Tool может быть хорошим решением. Он также работает с дампами кучи и показывает, какие объекты занимают память. В дополнение к этому он может отображать содержание объектов/мест расположения памяти.

я иногда встречается MAT выходит за рамки того, что делает VisualVM, но, возможно, вид, как это помогает вам найти ваши данные уже:

enter image description here

(Это скриншот выдуманным пример, когда я создаю некоторые пользовательские объекты в , чтобы показать их с их значением в heapdump)

Возможно, вы даже можете подключить Eclipse к запущенному приложению. Существует определенный трюк, в котором вы можете запускать собственный код в точке останова. Это можно каким-то образом сбросить данные на диск.

Смежные вопросы