Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以从堆转储实例化jvm?_Java_Jvm_Heap Dump - Fatal编程技术网

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

Java 是否可以从堆转储实例化jvm?,java,jvm,heap-dump,Java,Jvm,Heap Dump,每个人都知道,可以从运行的JVM获得堆转储。另一种方式可能吗?我们可以使用堆转储启动JVM吗 我已经考虑这个问题很久了。如果这是可能的,它将解决大量的时间,并使一个支持工程师的想法容易。如果我们不得不重现客户所面临的一些罕见问题,这将大大有助于解决这些问题。[想象一下,底层硬件和Java运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置] 补充说明:这样做的目的不是在OOM发生时,而是在JVM启动后的任何给定点。我认为您正在寻找像and(商业)这样的工具。这些帮助您进行事件分析、事件收

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

我已经考虑这个问题很久了。如果这是可能的,它将解决大量的时间,并使一个支持工程师的想法容易。如果我们不得不重现客户所面临的一些罕见问题,这将大大有助于解决这些问题。[想象一下,底层硬件和Java运行时是相同的,并且所有支持文件也存在于文件系统中的相应位置]


补充说明:这样做的目的不是在OOM发生时,而是在JVM启动后的任何给定点。

我认为您正在寻找像and(商业)这样的工具。这些帮助您进行事件分析、事件收集和分析、时间旅行调试(如chronon所述)

根据他们的文件:

Java任务控制

Java飞行记录器和Java任务控制一起创建一个 完整的工具链,持续收集低水平和详细信息 在事件分析之后启用运行时信息。JAVA Flight Recorder是一个构建的分析和事件收集框架 进入oraclejdk。它允许Java管理员和开发人员 收集有关Java虚拟机如何运行的详细底层信息 机器(JVM)和Java应用程序正在运行。爪哇使命 控件是一组高级工具,可实现高效 详细分析Java Flight收集的大量数据 录音机。工具链使开发人员和管理员能够 从本地或本地运行的Java应用程序收集和分析数据 部署在生产环境中。从发布 Oracle JDK 7更新40(7u40)

Chronon Recording Server的一些关键功能对您的情况非常有用:

录制服务器是专为长时间运行而设计的,可用于服务器 一次运行数周或数月的辅助应用程序。这个 录制服务器将负责分割录制,如果它 太大,刷新了旧的录音

不再需要查看冗长而稀疏的详细日志文件 调试你的程序。只需回放整个执行过程,然后查看 你的计划到底发生了什么。 录音服务器使其在不同的机器上共享录音 在团队成员之间或跨多个团队


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


我从来没有听说过任何从某种映像重新启动JVM的方法,堆转储根本不够,因为它只包含Java对象,而不包含编译后的代码和其他内容。

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

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

此外,由于堆转储通常来自OutOfMemory位置,因此从该位置重新创建JVM将再次抛出OutOfMemoryException。如果在这两者之间进行堆转储,则在启动jvm时序列化对象并还原它们


(内容复制自此问题的评论、作者和)

当您出现内存不足错误时,会创建堆转储,但这不是唯一的方法。这个答案是对作者意图的假设。只是因为a->b并不意味着b->a点是你没有回答他们的问题。(或者更确切地说,您的第一行是正确的,但您没有列出原因/内容。相反,您讨论的是生成转储的特定情况,该转储对于从中进行恢复没有帮助)。我认为第二段讲得很中肯,但第一段不中肯。