深入理解JVM之--常量池、运行时常量池、字符串常量池

前言

JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆中,这个变化也导致了String的新特性,接下来,我们按照jdk1.7开始后的版本进行介绍。

JdK1.7之前

深入理解JVM之--常量池、运行时常量池、字符串常量池_第1张图片

Jdk1.7开始

深入理解JVM之--常量池、运行时常量池、字符串常量池_第2张图片

 

一.常量池共有三类:

1.运行时常量池

2.Class文件常量池

3.字符串常量池

二. 详解

  1. 常量池(Constant Pool)

1.1 常量池(Class文件常量池):.java经过编译后生成的.class文件,是Class文件的资源仓库。

1.2 常量池中主要存放俩大常量:字面量(文本字符串,final常量)和符号引用(类和接口的全局定名,字段的名称和描述,方法的名称和描述),如下图:

深入理解JVM之--常量池、运行时常量池、字符串常量池_第3张图片

2. 运行时常量池(Constant Pool)

运行时常量池是方法区的一部分。在Class常量池中,用于存放编译期间生成的字面量和符号量,在类加载完之后,存入运行时常量池中。而运行时常量池期间也有可能加入新的常量(如:String.intern方法)

3. String常量池,

String常量池,JVM为了减少字符串对象的重复创建,在堆区开一段内存存放字符串。

 

你可能感兴趣的:(JVM)