首页 > 解决方案 > 在 Java 中使用直接内存的目的是什么?

问题描述

从 java 1.4 开始引入了直接内存。新的 I/O (NIO) 类引入了一种基于通道和缓冲区执行 I/O 的新方法。NIO 增加了对直接 ByteBuffers 的支持,它可以直接传递到本机内存而不是 Java 堆。在某些情况下使它们显着加快,因为它们可以避免在 Java 堆和本机堆之间复制数据。

我永远不明白我们为什么要使用直接记忆。有人可以帮忙举个例子吗?

标签: javajvm

解决方案


我永远不明白我们为什么要使用直接记忆。有人可以帮忙举个例子吗?

所有系统调用,例如读写套接字和文件,都只使用本机内存。他们不能使用堆。这意味着虽然您可以从堆中复制到本机内存或从本机内存复制,但避免这种复制可以提高效率。

我们使用堆外/本机内存来存储我们的大部分数据,这有很多优势。

  • 它可以大于堆大小。
  • 它可以大于主内存。
  • 它可以在 JVM 之间共享。即多个JVM 的一份副本。
  • 它可以在 JVM 甚至机器重新启动时持久化和保留。
  • 它对 GC 暂停时间几乎没有影响。
  • 根据使用情况,它可以更快

它没有被更多使用的原因是它更难使它既高效又像普通 Java 对象一样工作。出于这个原因,我们有诸如Chronicle Map之类的库,它充当ConcurrentMap但使用堆外内存,以及Chronicle Queue,它是一个日志、记录器和进程之间的持久 IPC。


推荐阅读