在Java中使用直接内存的目的是什么?

和莫里斯:

从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么是“使用”指令在Java中9的目的是什么?

在Java中使用同步(Thread.currentThread()){...}的目的是什么?

在Java中使用Supplier的优势是什么?

在Angular中使用方括号的目的是什么?

在函数参数中使用裸星号的目的是什么?

为什么在Java中使用堆内存

在Java代码注释中使用方括号的目的是什么?

在json中使用方括号的目的是什么?

在单行if或loop中使用大括号(即{})的目的是什么?

在子堆栈/磁带中使用“计划”与“结束”的目的是什么?

在DecisionTree中使用StringIO的目的是什么

在Xamarin中使用ReactiveUI的目的是什么

在React中使用类的目的是什么?

在Vuetify中使用<template>的目的是什么?

直接内存访问的优点是什么?

在颤振中使用路线的目的是什么?

在android中使用JSON的目的是什么?

在BeginForm中使用@的目的是什么

在整个测试中使用通用Webdriver对象的目的是什么

在shell脚本中使用shift的目的是什么?

BASH:在列表中使用`/`的目的是什么?

在JavaFX中使用.getChildren()。addAll()的目的是什么?

Java中使用的方法“.getChildren()”是什么?

在 WScript.CreateObject 中使用前缀的目的是什么?

在struct中使用union的目的是什么?

在 filter() 中使用 JQuery toggle() 的目的是什么?

我在 Java 中使用大内存的最佳实践是什么?

在 SQL Server 中使用 GO 语句的目的是什么?

在 Seekbar 中使用 secondaryProgressTint 的目的是什么?