从运行JVM导出数据?

时间:2016-02-13 09:18:49

标签: java instrumentation

这可能是一个问题的长镜头,但我遇到了一个非常复杂的问题,我不确定如何解决它。

简而言之,我们正在运行一个Java应用程序,它目前正在使用JDBC在启动时从MysQL数据库中提取数据。

我们已经崩溃了,而且数据库不再处于活动状态并且已经永远丢失,因此数据也随之丢失,这在内部非常有价值。

但是,数据仍然存储在正在运行的JVM的堆中。

我现在唯一的希望是以某种方式从正在运行的JVM中提取数据,在理想的世界中我能够附加到它并且可以灵活地运行可以访问内部运行类的代码。

所以今天我的问题是:

  • 我的方法是否合理且可行?
  • 如果是这样,我如何附加到JVM并注入'代码

感谢您阅读

2 个答案:

答案 0 :(得分:0)

您想要使用的是jmap命令。 jmap可用于将正在运行的JVM的堆转储到文件中,然后您可以使用jhat或JVisualVM等工具分析"离线"。

它允许您在不杀死JVM和/或将代码注入其中的情况下这样做,并且由于堆转储文件是"惰性",您可以在闲暇时分析它而不用担心会损害运行通过进一步探测VM。不可否认,我还没有广泛使用它,所以我不确切知道它的功能是什么,但理论上,你也可以使用JVisualVM的OQL语言在堆中的数据上运行自动序列并以您想要的格式将其转储到文件中。

例如,请参阅this question了解用法示例。

答案 1 :(得分:0)

在这种情况下,Eclipse Memory Analyzer Tool可能是一个很好的解决方案。它也适用于堆转储,并显示哪些对象占用内存。 除此之外,它还可以显示对象/内存位置的内容

我有时发现MAT超出了VisualVM的功能,但也许这样的视图可以帮助你找到你的数据:

enter image description here

(这是我在其中创建一些自定义对象的示例示例的屏幕截图 为了在heapdump中显示它们的值)

也许您甚至可以将Eclipse附加到正在运行的应用程序中。有一个技巧可以在断点中运行自定义代码。这个可以以某种方式将您的数据转储到磁盘。