我正在探索帮助我的内存密集型应用程序的选项,在这样做的过程中,我遇到了 Terracotta 的 BigMemory .据我所知,他们利用了非垃圾收集的堆外“ native 内存”,显然由于序列化/反序列化问题,这比堆存储慢 10 倍。在阅读 BigMemory 之前,我从未听说过普通 JNI 之外的“ native 内存”。尽管 BigMemory 是一个值得进一步考虑的有趣选项,但我对如果可以绕过序列化问题可以用 native 内存完成什么很感兴趣。
在没有序列化问题的情况下(例如,如果我将其与巨大的 byte[ ]
)?还是垃圾收集等变幻莫测使这个问题无法回答?我知道“测量它”是这里的常见答案,但恐怕我不会设置代表性测试,因为我对 Java 中 native 内存的工作原理还不够了解。
最佳答案
直接内存在执行 IO 时速度更快,因为它避免了数据的一个副本。但是,对于 95% 的应用程序,您不会注意到差异。
您可以将数据存储在直接内存中,但是它不会比存储数据 POJO 更快。 (或安全、可读或可维护)如果您担心 GC,请尝试提前创建您的对象(必须是可变的)并重用它们而不丢弃它们。如果您不丢弃您的元素,就没有什么可收集的。
Is Java native memory faster (I think this entails ByteBuffer objects?) than traditional heap memory when there are no serialization issues (for instance if I am comparing it with a huge byte[])?
如果您使用像 int
这样的非字节,直接内存可以比使用 byte[] 更快,因为它可以读取/写入整个四个字节,而无需将数据转换为字节。
但是,它比使用 POJO 慢,因为它必须对每次访问进行边界检查。
Or do the vagaries of garbage collection, etc. render this question unanswerable?
速度与GC无关。 GC 仅在创建或丢弃对象时才重要。
顺便说一句:如果你最大限度地减少你丢弃的对象的数量并增加你的伊甸园大小,你可以防止长时间发生即使是次要的收集,例如一整天。
关于java - Java native 内存比堆快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5863316/