我正在开发内存数据结构,并希望增加持久性。
我正在寻找一种快速完成此任务的方法。我想过偶尔转储堆转储。
有没有办法将这个java堆转储按原样加载到我的内存中?还是不可能?
否则,快速写入和快速读取整个信息的其他建议? (序列化可能需要很长时间)
-----------------编辑的探索:-------- 由于我的记忆可能充满了小块信息,互相引用 - 所以序列化可能要求我有效地扫描我的所有记忆。重装也可能存在问题。
另一方面,我可以定义一个巨大的数组,我创建的每个对象,我都会把它放在数组中。链接将是一个长数字,重新排列数组中的位置。现在,我可以按原样转储这个数组 - 并按原样重新加载它。
甚至有一些像JRockit这样的jvms可以利用磁盘空间,因此也许可以非常快速地转储并重新加载非常快速。 为了证明我的观点,java转储包含jvm的所有信息,并且它很快就会产生。 对不起,但4GB的序列化甚至没有接近秒转储。
此外,内存是内存,并且有一些操作系统允许您快速进行内存转储。 https://superuser.com/questions/164960/how-do-i-dump-physical-memory-in-linux
当你考虑它时......对于持久的数据结构来说,这是一个非常好的策略。在过去十年中,有关内存数据库的大肆宣传。但为什么会这样呢?如果我想要一个斐波纳契堆 - 几乎是“持久的”怎么办?也就是说,每隔5分钟我会快速转储信息,如果发生电力中断,我会在5分钟前进行备份。
-----------------编辑后的探索结束:--------
谢谢。
答案 0 :(得分:4)
通常,在HotSpot上无法执行此操作。
堆中的对象有2个单词的标题,其中第二个指向类元数据的permgen(称为klassOop)。您还必须转储所有的permgen,其中包括编译代码的所有指针 - 所以基本上是整个过程。
没有正确的方法来正确恢复堆状态。
最好准确地解释一下你想要建造什么?为什么现有的产品不能满足您的需求。
答案 1 :(得分:0)
使用序列化。实施java.io.Serializable
,将serialVersionUID
添加到您的所有类中,然后您可以将它们持久保存到任何OutputStream
(文件,网络等)。只需创建一个起始对象,从中可以访问所有对象(甚至间接)。
我不认为序列化需要很长时间,它是JVM中优化的代码。
答案 2 :(得分:-1)