这可能是一个很长的问题,但我遇到了一个非常复杂的问题,我不确定如何解决它。
长话短说,我们有一个正在运行的 Java 应用程序,它目前正在使用 JDBC 在启动时从 MysQL 数据库中提取数据。
我们遇到了崩溃,该数据库不再处于 Activity 状态并且永远丢失了,因此与之相关的数据在内部非常有值(value)。
但是,数据仍存储在将其拉入的正在运行的 JVM 的堆中。
我现在唯一的希望是以某种方式从正在运行的 JVM 中提取数据,在理想的情况下,我将能够附加到它并能够灵活地运行可以访问内部运行类的代码。
所以我今天的问题是:
- 我的方法是否合理可行?
- 如果可以,我如何附加到 JVM 并“注入(inject)”代码
感谢阅读
最佳答案
看来你要用的是jmap
命令。 jmap
可用于将正在运行的 JVM 的堆转储到文件中,然后您可以使用 jhat
或 JVisualVM 等工具“离线”分析该文件。
它允许您在不杀死 JVM 和/或向其中注入(inject)代码的情况下执行此操作,并且由于堆转储文件是“惰性的”,您可以在闲暇时对其进行分析,而不必担心通过进一步探测它而损害正在运行的 VM .不可否认,我没有广泛使用它,所以我不确定它的确切功能是什么,但理论上,您也许还可以使用 JVisualVM 的 OQL 语言对堆中的数据运行自动序列并将其转储到文件中的格式你想要的。
参见,例如,this question用于使用示例。
关于java - 从运行的 JVM 导出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378130/