是否可以从堆转储中实例化jvm?

时间:2014-12-03 09:00:53

标签: java jvm heap-dump

每个人都知道可以从正在运行的JVM获取堆转储。另一种可能吗?我们可以使用堆转储启动JVM吗?

我一直在考虑这个问题很长一段时间了。如果这是可能的话,它将解决大量时间并使支持工程师的思维变得容易。如果我们必须重新创建客户面临的一些罕见问题,它可以帮助您节省大量时间。 [想象一下底层硬件和Java运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置]。

补充说明:执行此操作的意图不是在OOM发生时,而是在JVM启动后的任何给定点。

3 个答案:

答案 0 :(得分:2)

不,你不能。 您需要每个打开文件中的当前位置等内容。这会影响简单顺序读取时返回的数据。恢复程序需要打开每个文件并将其置于正确的位置。对于不可寻找的流,这可能是不可能的。

程序特定的序列化是一个更加可行的路径,然后从那里设置程序。

此外,由于Heap Dumps通常来自OutOfMemory situtaions,从同一个JVM重新创建JVM会再次抛出OutOfMemoryException。如果你在两者之间进行堆转储,那么在你调出jvm时序列化你的对象并恢复它们。

(从此问题的评论中复制的内容,作者almas-shaikhpatricia-shanahan

答案 1 :(得分:1)

我认为您正在寻找Java Mission ControlChronon DVR(商业)等工具。这些可以帮助您进行事件分析,事件收集和分析,时间旅行调试(由chronon表示)

根据他们的文件:

Java Mission Control

  

Java Flight Recorder和Java Mission Control一起创建了一个   完整的工具链,不断收集低水平和细节   运行时信息,实现事后事件分析。 Java的   Flight Recorder是一个构建的分析和事件收集框架   进入Oracle JDK。它允许Java管理员和开发人员   收集有关Java Virtual如何的详细低级信息   机器(JVM)和Java应用程序正在运行。 Java使命   控制是一套先进的工具,可以提高效率   详细分析了Java Flight收集的大量数据   录音机。该工具链使开发人员和管理员能够   从本地运行的Java应用程序收集和分析数据   部署在生产环境中。从发布开始   Oracle JDK 7 Update 40(7u40)

Chronon Recording Server 的一些主要功能在您的情况下非常有用:

  

录制服务器专为长时间运行的服务器而设计   一次运行数周或数月的副应用程序。该   录音服务器将负责分割录音   太大了,冲掉旧录音。

     

摆脱需要查看冗长详细的日志文件   调试你的程序。只需回放整个执行并查看即可   确切地说,你的程序发生了什么。   录制服务器使其在不同的计算机上共享录制内容   在团队成员之间或跨多个团队。

答案 2 :(得分:1)

要从正在运行的JVM创建堆转储,您还可以使用jhat或jcmd(使用GC.heap_dump命令),这两者都存在于JDK / bin文件夹中。 MAT是分析转储内容的一种方式。 Java Mission Control有一个名为JOverflow的工具,用于分析堆转储,但仅用于查看内存浪费模式。

我从来没有听说过任何方法从图像类型重新启动JVM,堆转储根本就不够,因为它只包含Java对象,而不包含已编译的代码和其他东西。