试图将java对象存储在连续的内存中

我正在尝试实现类似缓存的对象集合。 目的是通过内存中的位置快速访问这些对象,因为我可能一次只能读取多个对象。 我目前只是将对象存储在像vector或deque这样的java集合对象中。 但我不相信这会利用连续的记忆。

我知道这可以在C中完成,但可以用Java完成吗? 这些对象可能具有不同的长度(因为它们可能包含字符串)。 有没有办法通过Java分配连续的内存? 是否有Java集合对象?

请告诉我。

谢谢,jbu

你不能强迫它。 如果快速连续分配所有对象,它们可能是连续的 – 但如果将它们存储在集合中,则无法保证集合对于实际值是本地的。 (该集合将引用对象,而不是包含对象本身。)

此外,GC压缩将在内存中移动值。

你有没有真实地描述你的应用程序,发现这是一个瓶颈? 在大多数情况下,我希望其他优化措施能够以更可靠的方式帮助您。

不,你不能保证这个地方的参考。

通过分配字节数组,或使用nio包中的映射字节缓冲区,您可以获得一块连续的内存,从中可以解码所需的数据(从这块内存中有效地反序列化感兴趣的对象)。 但是,如果您反复访问相同的对象,反序列化开销可能会失败。

你用Java编写过这段代码吗? 如果是这样,你有什么想法吗? 我认为你可能不需要担心对象在连续的内存中–JVM在内存管理方面比在垃圾收集环境中更好。

如果你真的关心性能,也许Java不适合这项工作,但我的直觉就是告诉你,你过早地担心优化,而且你的代码是Java版本,非连续的记忆,可能会满足您的需求。

我建议你的缓存使用HashMap(无线程)或Hashtable(线程)。 两者都将对象存储在sun jvm中的数组中。 由于java中的所有对象都是通过引用传递的,因此应该将其表示为c中的指针数组。 我敢打赌,你正在进行过早的优化。

如果你绝对必须拥有这个,你有两个选择:

1)使用JNI并在c中写入。 2)获取一个BIG字节缓冲区并使用ObjectOutputStream将对象写入其中。 与使用哈希表相比,这可能非常慢。