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

时间:2018-04-17 14:09:49

标签: java memory-management heap-memory stack-memory off-heap

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

编辑: 如果它们不相同,有人可以详细解释是什么使它们与一些基本解释不同。我是java内存管理的新手。

1 个答案:

答案 0 :(得分:3)

他们不一样。

差异:

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

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

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

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