当前位置: 首页 > 知识库问答 >
问题:

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

乐正浩博
2023-03-14

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

这个问题我已经想了很久了。如果这是可能的,它将解决大量的时间,并使支持工程师容易思考。如果我们必须重新创建一些我们的客户所面临的罕见的问题,那么它就会大有帮助。[假设底层硬件和Java运行时是相同的,并且所有的支持文件也存在于文件系统中各自的位置]。

添加注意:这样做的意图不是在OOM发生时,而是在JVM启动后的任何给定点。

共有1个答案

西门智
2023-03-14

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

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

此外,由于堆转储通常来自OutOfMemory环境,因此从相同环境重新创建JVM将再次引发OutOfMemoryException。如果在这两者之间进行堆转储,那么序列化对象并在启动JVM时还原它们。

(内容摘自作者almas-shaikh和patricia-shanahan对本问题的评论)

 类似资料:
  • Eclipse Memory Analyser文档称它可以打开IBM便携堆转储文件(*.phd):

  • 问题内容: 我知道,当我阅读答案时,会发现我已经忽略了我眼中的事物。但是我花了最后30分钟试图自己弄清楚,但没有结果。 因此,我正在用Java 6编写程序,并发现了一些(对我而言)奇怪的功能。为了尝试隔离它,我举了两个小例子。我首先尝试了以下方法: 编译器拒绝了它:类型不匹配:无法从null转换为int。 这对我来说很好,并且尊重我熟悉的Java语义。然后我尝试了以下方法: 编译没有错误!但是,我

  • 最后一个2字节加载从紧邻的前一个存储区中获取第二个字节,但从前一个存储区中获取第一个字节。这个加载可以被存储转发吗,还是需要等到前面的两个存储都提交到L1? 请注意,通过这里的存储转发,我包含了任何机制,这些机制可以满足来自仍然在存储缓冲区中的存储的读取,而不是等待它们提交到L1,即使这是一个比“从单个存储转发”的最佳情况更慢的路径。

  • 我有三节课。 > 一个抽象类,abstractA有一个受保护的构造函数 一个类扩展了抽象类,父类有两个构造函数 一个类扩展父类,子类有一个构造函数 这是从抽象类扩展而来的父类 这是从父类扩展而来的子类 自定义组件看起来像这样 所以,当spring为特定测试实例化所有bean时,它会正确地实例化子bean。当父bean被实例化时,它得到2个bean[父和子]。所以,我最终会出错, 类型父的多个bea

  • 我想用Lambda函数部署AWS CDK堆栈。用例是支持类似于Trek10无服务器CI/CD管道中描述的功能,相关代码如下。 简而言之,AWS代码管道仅支持在单个Git分支中侦听更改。我想听听与创建repo和分支相关的GitHub事件,并创建代码管道实例来响应这些事件,以便每个Git存储库的每个分支都有一个管道。我想要一个Lambda来监听GitHub事件并创建CDK堆栈。Trek10示例使用Py

  • 使用lombok,我感兴趣的是通过基类实例的构造函数将所有字段复制到派生类,这与C copy构造函数的功能非常相似。目前,人们关注的并不是这本书是深的还是浅的。我有一个基类,如下所示, 我感兴趣的是自动生成一个派生类构造函数,它接受基类实例,并将所有字段(浅或深)复制到派生类。例如 我可以根据需要灵活地注释父类和子类,但是我不想手工创建构造函数,它会逐个复制每个字段。示例用法