【问题标题】:Java Memory ManagementJava 内存管理
【发布时间】:2015-12-27 14:52:15
【问题描述】:

我有两个关于 Java 内存管理的问题。

  1. 静态变量和实例变量存储在哪里?我相信静态变量存储在 premgen 中,但我不确定实例变量。
  2. permgen 是堆还是方法区域的子集?

当我在谷歌上搜索时,我发现有些人说静态变量存储在堆的 permgen 部分,但其他人说 permgen 是方法区域的子集。如果后者为真,那么静态变量是否存储在方法区?

【问题讨论】:

标签: java


【解决方案1】:
Where are static and instance variables stored?

它从 Java 版本更改为 Java 版本,从运行时更改为运行时。最终,Java 被编写为隐藏内存细节,例如“我的对象在内存中的什么位置?”。

一些编译器可能会优化对象,将它们声明在堆栈或任何他们认为合适的地方。

所以答案是——“我们无法确定,这对 Java 真的很重要吗?”

【讨论】:

    【解决方案2】:

    堆栈存储更多地取决于变量是否是原始,例如int 或 对象

    除非您的原语是对象的一部分,否则它很可能会在调用堆栈上创建。否则它将被创建为堆上对象的一部分。

    正如其他人所提到的,在稳定的 Java(即 8 )中不再有 PermGen 并且正在向前发展。

    PermGen elimination in JDK 8

    Do Java primitives go on the Stack or the Heap?

    Where does the JVM store primitive variables?

    【讨论】:

    • 这有点对,但并非总是如此,那么逃逸分析呢?
    【解决方案3】:

    在 JDK 8 中不再有 PERMGEN:

    随着 JDK8 的出现,我们不再拥有 PermGen。不,元数据信息并没有消失,只是它所在的空间不再与 Java 堆连续。元数据现在已移动到本机内存的一个称为“元空间”的区域。

    查看下面的链接了解详细信息并回答您的第二个问题。

    http://www.infoq.com/articles/Java-PERMGEN-Removed

    【讨论】:

    • 只有链接的答案被认为是低质量的答案。因为链接将来可能会中断。请从帖子中的链接中获取所需信息。
    • 按照建议从帖子中的链接获取信息,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2018-08-17
    • 2012-08-08
    相关资源
    最近更新 更多