从Java 1.4开始引入了直接内存。新的I / O(NIO)类引入了一种基于通道和缓冲区执行I / O的新方法。NIO添加了对直接ByteBuffer的支持,该支持可以直接传递给本机内存,而不是Java堆。在某些情况下,使它们显着更快,因为它们可以避免在Java堆和本机堆之间复制数据。
我不明白为什么我们要使用直接记忆。有人可以帮个例子吗?
JVM依靠垃圾回收的概念来回收不再使用的内存。这使JVM语言开发人员(例如Java,Scala等)不必担心内存分配和释放。您只需请求内存,然后让JVM担心何时将其回收或进行垃圾回收。
尽管这非常方便,但是它带来了单独线程的额外开销,消耗了CPU并不得不不断地遍历JVM堆,从而回收不再可访问的对象。有很多关于该主题的书籍,但是如果您想更多地了解JVM垃圾收集,那么这里有很多参考文献,但是这很不错:https://dzone.com/articles/understanding-the- Java内存模型和垃圾袋
无论如何,如果在您的应用程序中,您知道将要进行大量的复制,更新对象和值,则可以选择自己处理这些对象及其内存消耗。因此,无论这些对象有多少搅动,这些对象都不会在堆中四处移动,也永远不会被垃圾回收,因此不会影响JVM中的垃圾回收。这个答案还有更多细节:https : //stackoverflow.com/a/6091680/236528
从官方Javadoc:
直接与非直接缓冲区
字节缓冲区可以是直接的,也可以是非直接的。给定直接字节缓冲区,Java虚拟机将尽最大努力直接在其上执行本机I / O操作。也就是说,它将尝试避免在每次调用底层操作系统的本机I / O操作之前(或之后)将缓冲区的内容复制到中间缓冲区(或从中间缓冲区复制)。
甲直接字节缓冲器可以通过调用来创建
allocateDirect
这个类的工厂方法。这种方法返回的缓冲区通常比非直接缓冲区具有更高的分配和释放成本。直接缓冲区的内容可能驻留在普通垃圾回收堆的外部,因此它们对应用程序内存占用的影响可能并不明显。因此,建议直接缓冲区主要分配给大型的,寿命长的缓冲区,这些缓冲区要经受基础系统的本机I / O操作。通常,最好仅在直接缓冲区产生可观的程序性能提升时才分配它们。
https://download.java.net/java/early_access/jdk11/docs/api/java.base/java/nio/ByteBuffer.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句