Skip to content

不同常量池在 JDK6~8 中存放的位置 #613

Open
@jiabinl

Description

@jiabinl

根据 https://www.javatt.com/p/47643

JVM 中有三类常量池

  1. 静态常量池(class 文件中的常量池)
  2. 运行时常量池
  3. 字符串常量池

他们再 JDK6~8 中分别位于不同的地方

在JDK6及之前的版本:
静态常量池在Class文件中。
运行时常量池在Perm Gen区(也就是方法区)中。(所谓的方法区是在Java堆的一个逻辑部分,为了与Java堆区别开来,也称其为非堆(Non-Heap),那么Perm Gen(永久代)区也被视为方法区的一种实现。)
字符串常量池在运行时常量池中。

在JDK7版本:
静态常量池在Class文件中。
运行时常量池依然在Perm Gen区(也就是方法区)中。在JDK7版本中,永久代的转移工作就已经开始了,将譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。但是运行时常量池依然还存在,只是很多内容被转移,其只存着这些被转移的引用。网上流传的一些测试运行时常量池转移的方式或者代码,其实是对字符串常量池转移的测试。

在JDK8版本:
静态常量池在Class文件中。
JVM已经将运行时常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行时常量池。同时永久代被移除,以元空间代替。元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。其主要用于存放一些元数据。
字符串常量池存在于Java堆中。

请问这三类常量池在 JDK6~8 中分别如何对应到 JVM 的内存模型中?

Metadata

Metadata

Assignees

No one assigned

    Labels

    awesomeenhancementNew feature or request or suggestion

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions