0

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

我正在寻找一种方法来快速做到这一点。我想过偶尔转储一个堆转储。

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

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

-----------------编辑解释:--------由于我的记忆中可能充满了小信息,因此相互引用-因此序列化可能需要我有效地扫描我所有的记忆。重新加载也可能有问题。

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

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

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

仔细想想……这对于持久数据结构来说是一个很好的策略。在过去的十年里,内存数据库被大肆宣传。但为什么要为此安顿下来?如果我想要一个斐波那契堆怎么办——“几乎是持久的”。也就是说,每 5 分钟我会(快速)转储信息,如果发生电力中断,我会从 5 分钟前开始备份。

------编辑说明结束:--------

谢谢你。

4

3 回答 3

4

一般来说,没有办法在 HotSpot 上执行此操作。

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

没有理智的方法可以正确地恢复堆状态。

最好准确地解释您想要构建的内容以及为什么现有产品不能满足您的需求。

于 2013-07-22T12:48:55.583 回答
0

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

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

于 2013-07-22T12:59:52.493 回答
-1

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

于 2013-07-22T09:52:38.773 回答