【问题标题】:Are off-heap memory and Stack memory the same?堆外内存和堆栈内存一样吗?
【发布时间】:2018-09-27 13:17:24
【问题描述】:

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

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

【问题讨论】:

  • 这是stackoverflow.com/questions/6091615/… 的副本(其中至少有一个答案给出了这个问题的答案,它是否定的)。我无法投票结束,因为我不小心撤回了最初的结束投票。
  • 这不是一个重复的问题。我不是在问堆上内存和堆外内存之间的区别,或者我的问题是找出堆栈和堆内存之间的区别。问题是要了解堆外内存和堆栈内存是否相同?
  • 这个问题的答案stackoverflow.com/a/13894476/169346 告诉你你需要知道的一切。答案是“不,它们不一样”。
  • @JeremyP,感谢您的提示。我已经更新了我的问题,如果您可以查看并提交您的 cmets,那就太好了。

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


【解决方案1】:

它们不一样。

区别:

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

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


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

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

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 2011-06-13
    • 2011-08-15
    • 1970-01-01
    • 2020-10-10
    • 2011-08-01
    • 2011-02-16
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多