每个人都知道可以从正在运行的 JVM 中获取堆转储。另一种方法可能吗?我们可以使用堆转储启动 JVM 吗?
这个问题我想了很久。如果这是可能的,它将解决很多时间,并使支持工程师的思考变得容易。如果我们必须重新创建客户面临的一些罕见问题,它会很有帮助。 [想象一下,底层硬件和 Java 运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置]。
补充说明:这样做的目的不是在 OOM 发生时,而是在 JVM 启动后的任何给定时间。
最佳答案
不,你不能。 您将需要每个打开文件中的当前位置等信息。这会影响简单顺序读取时返回的数据。恢复者需要打开每个文件并将其放到正确的位置。对于不可搜索的流,这可能是不可能的。
程序特定的序列化是一个更可行的路径,然后从那里设置程序。
此外,由于堆转储通常来自 OutOfMemory 情况,因此从相同的情况重新创建 JVM 将再次抛出 OutOfMemoryException。如果您在两者之间进行堆转储,则序列化您的对象并在您启动 jvm 时恢复它们。
(从这个问题的评论中复制的内容,作者 almas-shaikh 和 patricia-shanahan)
关于java - 是否可以从堆转储中实例化 jvm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27267414/