繁体   English   中英

堆外 memory 是 Java/JVM 标准吗?

[英]Is Off-heap memory is a Java/JVM standard?

我正在阅读 HBase 文档并遇到了堆外读取路径据我了解,堆外是 memory 中的一个地方,其中 Java 存储垃圾收集器范围之外的字节/对象。 我还去搜索了一些有助于使用堆外 memory 的库并找到了 Ehcatche但是,我找不到来自 oracle 或 Z18B5A217C4DAD25662D3A05EDB0E3 的任何官方文档。 那么这是 JVM 的标准功能还是某种 hack,如果它是用于执行此操作的底层类和技术是什么?

你应该寻找ByteBuffer

直接与非直接缓冲区

字节缓冲区可以是直接的,也可以是非直接的。 给定一个直接字节缓冲区,Java 虚拟机将尽最大努力直接在其上执行本机 I/O 操作。 也就是说,它将尝试避免在每次调用底层操作系统的本机 I/O 操作之一之前(或之后)将缓冲区的内容复制到(或从)中间缓冲区。

可以通过调用此 class 的 allocateDirect 工厂方法来创建直接字节缓冲区。 此方法返回的缓冲区通常比非直接缓冲区具有更高的分配和释放成本。 直接缓冲区的内容可能位于正常的垃圾收集堆之外,因此它们对应用程序的 memory 占用空间的影响可能并不明显。 因此,建议将直接缓冲区主要分配给受底层系统的本机 I/O 操作影响的大型、长期存在的缓冲区。 通常,最好仅在直接缓冲区对程序性能产生可测量的增益时才分配它们。

也可以通过将文件的区域直接映射到 memory 来创建直接字节缓冲区。 Java 平台的实现可以选择支持通过 JNI 从本机代码创建直接字节缓冲区。 如果其中一种缓冲区的实例引用了 memory 的不可访问区域,则访问该区域的尝试不会更改缓冲区的内容,并且会在访问时或稍后引发未指定的异常时间。

字节缓冲区是直接的还是非直接的可以通过调用它的 isDirect 方法来确定。 提供此方法以便可以在性能关键代码中完成显式缓冲区管理。

如何处理直接 ByteBuffers 取决于 JVM 实现,但至少 OpenJDK JVM 正在堆外分配 memory。

JEP 383:外部内存访问 API(第二孵化器)功能正在Java 15孵化 此功能将通过提供公共 API 来访问堆外 memory 标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM