当前位置: 首页 > 知识库问答 >
问题:

离堆内存是Java/JVM标准吗?

钮边浩
2023-03-14

我在阅读HBase文档时遇到了离堆读取路径,据我所知,离堆是内存中的一个地方,Java在那里存储垃圾回收器无法触及的对象。我还去搜索了一些方便使用离堆内存的libs,并找到了Ehcatche,但是,我找不到任何关于他的oracle或JVM的官方文档。那么,这是JVM的标准功能,还是某种程度的攻击,如果是,那么底层的类和技术是什么。

共有1个答案

吴开宇
2023-03-14

您应该查找ByteBuffer

直接与非直接缓冲器

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

可以通过调用该类的allocateDirect工厂方法来创建直接字节缓冲区。此方法返回的缓冲区通常比非直接缓冲区具有更高的分配和解除分配成本。直接缓冲区的内容可能驻留在正常垃圾收集堆之外,因此它们对应用程序内存占用的影响可能不明显。因此,建议将直接缓冲区主要分配给受基础系统本机I/O操作影响的大型、长寿命缓冲区。通常,只有当直接缓冲区在程序性能中产生可测量的增益时,才最好分配直接缓冲区。

还可以通过将文件的区域直接映射到存储器来创建直接字节缓冲器。Java平台的实现可以可选地支持通过JNI从本机代码创建直接字节缓冲区。如果这些类型的缓冲区之一的实例引用了内存中的不可访问区域,那么访问该区域的尝试将不会改变缓冲区的内容,并且将导致在访问时或稍后某个时间抛出未指定的异常。

字节缓冲区是直接的还是非直接的,可以通过调用其isDirect方法来确定。提供此方法是为了可以在性能关键代码中进行显式缓冲区管理。

如何处理直接字节缓冲区取决于JVM实现,但至少OpenJDK JVM是在堆外分配内存的。

针对Java14的JEP-383外部内存访问API将通过提供公共API使访问离堆内存成为标准

 类似资料:
  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 问题内容: 我们在 Tomcat 服务器上部署了一个Web应用程序。我们运行某些计划的作业,然后堆内存达到峰值并稳定下来,一切似乎都很好。但是,系统管理员抱怨内存使用率(Linux上的“ top”)随着计划的作业的增加而不断增加。堆内存和CPU内存之间有什么关联?可以通过任何JVM设置来控制它吗?我使用 JConsole 监视系统。 我通过JConsole强制进行垃圾收集,并且堆使用率下降了,但是

  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的

  • 我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的

  • 问题内容: jvm进程的内存使用量一直在增加,并且从未减少。我通过在linux服务器上执行top进行检查。该应用程序正在将作业调度到群集(使用Quartz + SunJava DRMAA API) Java堆空间在应用程序生命周期内保持在限制之内,但是jvm进程显示内存使用率稳定增长且从未下降。 这是内存泄漏吗?如果是这样,为什么堆空间在限制之内。有人可以解释一下。 更新: 当我通过jconsol