堆外内存和堆栈内存是一样的吗?



我知道堆栈和堆内存之间的区别,但是在许多博客中,我遇到了内存off-heap这个词。我浏览了许多博客和YouTube视频,以了解堆外内存和堆栈内存之间是否存在任何关系? 根据这个问题的流行答案,我可以理解堆外内存是指由 EHCache 管理且不受垃圾回收影响的存储对象。这个定义是完美的,但我的问题是,堆外内存是否与堆栈内存相同,或者它一起是内存管理中的不同实体?

编辑: 如果它们不同,有人可以通过一些基本的解释详细解释它们的不同之处。我对java内存管理很陌生。

它们不一样。

区别:

堆栈内存
  • 组织为跟踪方法调用生存期的堆栈,但堆外内存不是
  • 当调用方法和返回2时,堆栈内存隐式分配和释放为1,但堆外内存通过(通常)调用本机代码来分配和释放。

这就是典型的Java开发人员需要知道的全部内容。 如果你想更深入地挖掘,看看OpenJDK源代码。


1 - 堆栈本身由 Thread.start() 隐式分配,并在线程终止时释放。 它们是堆外内存的一种形式,但需要从操作系统请求它们才能实现通常用于检测堆栈溢出的"红色区域"......

2 - 这忽略了以下事实:启用"转义分析"时,JIT 可能会生成将本地对象分配到堆栈的代码。 如果发生这种情况,则堆栈内存的名义分配和释放可能会在方法调用中发生。

相关内容

最新更新