每个人都知道可以从正在运行的JVM获取堆转储。另一种可能吗?我们可以使用堆转储启动JVM吗?
我一直在考虑这个问题很长一段时间了。如果这是可能的话,它将解决大量时间并使支持工程师的思维变得容易。如果我们必须重新创建客户面临的一些罕见问题,它可以帮助您节省大量时间。 [想象一下底层硬件和Java运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置]。
补充说明:执行此操作的意图不是在OOM发生时,而是在JVM启动后的任何给定点。
答案 0 :(得分:2)
不,你不能。 您需要每个打开文件中的当前位置等内容。这会影响简单顺序读取时返回的数据。恢复程序需要打开每个文件并将其置于正确的位置。对于不可寻找的流,这可能是不可能的。
程序特定的序列化是一个更加可行的路径,然后从那里设置程序。
此外,由于Heap Dumps通常来自OutOfMemory situtaions,从同一个JVM重新创建JVM会再次抛出OutOfMemoryException。如果你在两者之间进行堆转储,那么在你调出jvm时序列化你的对象并恢复它们。
(从此问题的评论中复制的内容,作者almas-shaikh和patricia-shanahan)
答案 1 :(得分:1)
我认为您正在寻找Java Mission Control和Chronon 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对象,而不包含已编译的代码和其他东西。