我正在尝试实现类似缓存的对象集合。目的是通过内存中的位置快速访问这些对象,因为我可能一次只能读取多个对象。我目前只是将对象存储在像vector或deque这样的java集合对象中。但我不相信这会利用连续的记忆。
我知道这可以在C中完成,但可以用Java完成吗?这些对象可能具有不同的长度(因为它们可能包含字符串)。有没有办法通过Java分配连续的内存?是否有一个Java集合对象?
请告诉我。
谢谢, JBU
答案 0 :(得分:14)
你不能强迫它。如果快速连续分配所有对象,则它们可能是连续的 - 但如果您将它们存储在集合中,则无法保证集合将是实际值的本地集合。 (该集合将引用对象,而不是包含对象本身。)
此外,GC压缩会在内存中移动值。
您是否真的对自己的应用进行了分析,发现这是一个瓶颈?在大多数情况下,我希望其他优化措施能够以更可靠的方式帮助您。
答案 1 :(得分:9)
不,你不能保证这个地方参考。
通过分配字节数组,或使用nio
包中的映射字节缓冲区,您可以获得一块连续的内存,从中可以解码所需的数据(有效地反序列化感兴趣的对象)这块记忆)。但是,如果您反复访问相同的对象,反序列化开销可能会失败。
答案 2 :(得分:4)
您是否已使用Java编写此代码?如果是这样,你有什么想法吗?我认为您可能不需要担心对象在连续的内存中 - JVM在内存管理方面比在垃圾收集环境中更好。
如果你真的关心性能,也许Java不适合这项工作,但我的直觉就是告诉你,你过早担心优化,而你的代码是Java版本使用非连续内存,可能会满足您的需求。
答案 3 :(得分:-1)
我建议为缓存使用HashMap(无线程)或Hashtable(线程)。两者都将对象存储在sun jvm中的数组中。由于java中的所有对象都是通过引用传递的,因此应该将其表示为c中的指针数组。我敢打赌,你正在进行过早的优化。
如果你绝对必须这样做,你有两个选择:
1)使用JNI并在c中写入。 2)获取一个BIG字节缓冲区并使用ObjectOutputStream将对象写入其中。与使用哈希表相比,这可能非常慢。