快速java启动/ jvm持久性 - 使用堆转储中的数据启动jvm

时间:2013-07-22 09:37:43

标签: java jvm

我正在开发内存数据结构,并希望增加持久性。

我正在寻找一种快速完成此任务的方法。我想过偶尔转储堆转储。

有没有办法将这个java堆转储按原样加载到我的内存中?还是不可能?

否则,快速写入和快速读取整个信息的其他建议? (序列化可能需要很长时间)

-----------------编辑的探索:-------- 由于我的记忆可能充满了小块信息,互相引用 - 所以序列化可能要求我有效地扫描我的所有记忆。重装也可能存在问题。

另一方面,我可以定义一个巨大的数组,我创建的每个对象,我都会把它放在数组中。链接将是一个长数字,重新排列数组中的位置。现在,我可以按原样转储这个数组 - 并按原样重新加载它。

甚至有一些像JRockit这样的jvms可以利用磁盘空间,因此也许可以非常快速地转储并重新加载非常快速。 为了证明我的观点,java转储包含jvm的所有信息,并且它很快就会产生。 对不起,但4GB的序列化甚至没有接近秒转储。

此外,内存是内存,并且有一些操作系统允许您快速进行内存转储。 https://superuser.com/questions/164960/how-do-i-dump-physical-memory-in-linux

当你考虑它时......对于持久的数据结构来说,这是一个非常好的策略。在过去十年中,有关内存数据库的大肆宣传。但为什么会这样呢?如果我想要一个斐波纳契堆 - 几乎是“持久的”怎么办?也就是说,每隔5分钟我会快速转储信息,如果发生电力中断,我会在5分钟前进行备份。

-----------------编辑后的探索结束:--------

谢谢。

3 个答案:

答案 0 :(得分:4)

通常,在HotSpot上无法执行此操作。

堆中的对象有2个单词的标题,其中第二个指向类元数据的permgen(称为klassOop)。您还必须转储所有的permgen,其中包括编译代码的所有指针 - 所以基本上是整个过程。

没有正确的方法来正确恢复堆状态。

最好准确地解释一下你想要建造什么?为什么现有的产品不能满足您的需求。

答案 1 :(得分:0)

使用序列化。实施java.io.Serializable,将serialVersionUID添加到您的所有类中,然后您可以将它们持久保存到任何OutputStream(文件,网络等)。只需创建一个起始对象,从中可以访问所有对象(甚至间接)。

我不认为序列化需要很长时间,它是JVM中优化的代码。

答案 2 :(得分:-1)

您可以使用jhatjvisualvm加载转储以进行分析。我不知道转储文件是否可以加载并重新启动。