java - 在 Java 中使用直接内存的目的是什么?
问题描述
从 java 1.4 开始引入了直接内存。新的 I/O (NIO) 类引入了一种基于通道和缓冲区执行 I/O 的新方法。NIO 增加了对直接 ByteBuffers 的支持,它可以直接传递到本机内存而不是 Java 堆。在某些情况下使它们显着加快,因为它们可以避免在 Java 堆和本机堆之间复制数据。
我永远不明白我们为什么要使用直接记忆。有人可以帮忙举个例子吗?
解决方案
我永远不明白我们为什么要使用直接记忆。有人可以帮忙举个例子吗?
所有系统调用,例如读写套接字和文件,都只使用本机内存。他们不能使用堆。这意味着虽然您可以从堆中复制到本机内存或从本机内存复制,但避免这种复制可以提高效率。
我们使用堆外/本机内存来存储我们的大部分数据,这有很多优势。
- 它可以大于堆大小。
- 它可以大于主内存。
- 它可以在 JVM 之间共享。即多个JVM 的一份副本。
- 它可以在 JVM 甚至机器重新启动时持久化和保留。
- 它对 GC 暂停时间几乎没有影响。
- 根据使用情况,它可以更快
它没有被更多使用的原因是它更难使它既高效又像普通 Java 对象一样工作。出于这个原因,我们有诸如Chronicle Map之类的库,它充当ConcurrentMap
但使用堆外内存,以及Chronicle Queue,它是一个日志、记录器和进程之间的持久 IPC。
推荐阅读
- javascript - 为什么只更新第一行的函数效果?
- bash - 我的 PyCharm 在 Linux Mint 中以 /usr/bin/sh 而不是 /bin/bash 开头,并且不手动更改
- javascript - 如果任何元素内的所有 html 元素都被隐藏,则隐藏特定的 html 元素
- javascript - ionic 4 ion-item 在同一行显示数据。如果数据太长,则只显示能显示的数据
- java - 在本机应用程序中膨胀类 com.jjoe64.graphview.GraphView 时出错
- bash - complete -E 完成设置
- hyperledger-fabric - 在 Hyperledger Fabric 2.0 错误中实现私有数据收集
- vb.net - Directory.Enumerate Files - 需要通过严格的文件扩展名过滤
- paypal - 您能否为过去(无 IPN)交易生成新的 PayPal IPN?
- expo - 如何使用资源所有者密码流使用我们的 OAuth 服务器身份验证?