2

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

编辑:如果它们不一样,有人可以用一些基本解释详细解释是什么让它们不同。我对java内存管理很陌生。

4

1 回答 1

3

他们不一样。

区别:

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

这就是典型的 Java 开发人员需要知道的一切。如果您想深入挖掘,请查看 OpenJDK 源代码。


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

2 - 这忽略了当启用“转义分析”时,JIT 可能会生成将本地对象分配到堆栈上的代码。如果发生这种情况,那么名义上的堆栈内存分配和释放可能发生在方法调用中。

于 2018-04-17T14:39:14.953 回答