JVM中常量池存放在哪里

Python012

JVM中常量池存放在哪里,第1张

java8之前: java8之后:元数据区 Metaspace 由于 PermGen 内存管理的效果远没有达到预期,所以JCP已经着手去除PermGen的工作。在JDK7中,字符串常量已经从永久代移除。现今 JDK8 中 PermGen 已经被彻底移除,取而代之的是metaspace数据区,使用native内存,申请和释放由虚拟机负责管理。 那么,JVM中常量池到底存放在哪里? Java6和6之前,常量池是存放在方法区(永久代)中的。 Java7,将常量池是存放到了堆中。 Java8之后,取消了整个永久代区域,取而代之的是元空间。 运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。

java类加载:就是把.class文件读进虚拟机内存,然后按照一定的结构存储起来,类加载器,就是加载的工具类。

java虚拟机把内存分成

程序计数器:存储程序运行指令的内存

方法区:存储java类结构的内存

常量池:存储java常量的内存

堆:就是存储new对象的内存

栈:就是保存方法内局部变量的内存

名字都是jvm中翻译过来的。有本书叫深入java虚拟机。这方面的知识讲得比较完全

java常量池不在堆中也不在栈中,是独立的内存空间管理。

1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

2. 堆:存放所有new出来的对象。

3. 常量池:存放字符串常量和基本类型常量(public static final)。

对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。