java - Java native 内存比堆快吗?

标签 java memory garbage-collection bytebuffer terracotta

我正在探索帮助我的内存密集型应用程序的选项,在这样做的过程中,我遇到了 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/

相关文章:

java - Android 助手类

java - 如何在堆栈中使用 ToString

c++ - 使用 std::move 与使用指向线程的指针相比是否有性能成本?

java - StringBuilder 最有效的初始容量大小?

java - G1 垃圾收集器日志分析器

java - 我做了什么使 "weak refs processing"需要 30 秒而不是 1.5 秒?

java - 使用 Java 检测互联网连接

java - YGC(ParNew)实时时间远高于user+sys时间

java - 我的java程序最多使用多少内存?

Java:WeakReference.get() 在 System.gc() 之后返回不同