Methrod Area 方法区(常量 + 静态变量 + 类元信息(就是类的代码信息)+运行时常量池)

120 阅读4分钟

1.方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法信息都保存在该区域,此区域属于共享区间;

2.静态变量(static)、常量(final 常量和变量都属于变量,只不过常量是赋过值后不能再改变的变量,而普通的变量可以再进行赋值操作)、类信息(字段、方法、接口等描述信息、常量池)(Class)、运行时的常量池存在方法区中,但是实例变量存在堆内存中和方法区无关。

3.什么是运行时的常量池(Runtime Constant pool)?

运行时的常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入运行时常量池中存放。

运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)

3.1 什么是字面量?

在计算机科学中, 字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示, 诸如: 整数, 浮点数以及字符串; 而有很多也对布尔类型和字符类型的值也支持字面量表示; 还有一些甚至对枚举类型的元素以及像数组, 记录和对象等复合类型的值也支持字面量表示法.
很抽象, 举个例子就明白了.

int i = 1;把整数1赋值给int型变量i,整数1就是Java字面量, String s = "abc";中的abc也是字面量。

3.2符号引用

符号引用以一组符号来描述所引用的目标, 符号可以是任何形式的字面量, 只要使用时能够无歧义的定位到目标即可. 例如, 在Java中, 一个Java类将会编译成一个class文件. 在编译时, Java类并不知道所引用的类的实际地址, 因此只能使用符号引用来代替. 比如org.simple.People类引用了org.simple.Language类, 在编译时People类并不知道Language类的实际内存地址, 因此只能使用符号org.simple.Language来表示Language类的地址.

4.栈+堆+方法区:交互关系

image.png 常量池:

image.png

问题:从常量池和代码我们可以看到 没有 a=1 里的1 和a=2里的2 以及b=9527 的9527这是为什么?

image.png blog.csdn.net/Viscu/artic… blog.csdn.net/xiaojin21ce…

对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中的。

JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类:

取值 -1~5 采用 iconst 指令;

取值 -128~127 采用 bipush 指令;

取值 -32768~32767 采用 sipush指令;

取值 -2147483648~2147483647 采用 ldc 指令。

5.总结

5.1 a=1

1.如果a作为类的成员变量,存放于方法区中;1是过通过iconst_1指令将int型的1推送至栈顶,再通过putfiled指令,将1赋值给了字段a,由此可以知道,如果int类型的数值如果比较简单的话,是不会将该值放入常量池中的,可以直接通过JVM指令将值赋值给相应字段。

2 .如果a作为方法局部变量,存放于Java虚拟机栈(JVM Stacks)的局部变量表中;1也保存在栈内存中。) 5.2 如果我们执行new RuntimeConstantsPoolTest ();操作,a、name变量会在构造函数中初始化,iconst_2通过putfield赋予了值(a=2), ldc 通过putfield赋予了值(name=kim)。 JVM在加载Class时,创建instanceKlass,表示其元数据,包括常量池、字段、方法等,存放在方法区,所以成员变量a、name就在方法区咯。在new一个对象时,JVM创建instanceOopDesc,来表示这个对象,存放在堆区,其引用,存放在栈区;所以2存放在堆中,name的值指向运行时常量池的kim。