Open
Description
根据 https://www.javatt.com/p/47643
JVM 中有三类常量池
- 静态常量池(class 文件中的常量池)
- 运行时常量池
- 字符串常量池
他们再 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 的内存模型中?