Q1.JVM方法区包含什么

1.class文件信息

1.魔数 magic
2.副版本号 minor_version
3.主版本号 major_version
4.(静态)常量池计数器 constant_pool_counter
5.(静态)常量池数据区 constant_pool_count个数据
6.访问标志 access_flags
7.类索引 this_class
8.父类索引 super_class
9.接口计数器 interface_counter
10.接口信息数据区 interface_count个interface数据

2.运行时常量池(动态常量池)

Q2.常量池里可以包含什么?

字面量

1.基本数据类型 int a=0;
2.字符串 String s = "abc";Q
3.final修饰的常量值
4.其他。

符号引用

1.类和结构的完全限定名 org.simple.People
2.字段名称和描述符
3.方法名称和描述符

Q3. 静态常量池和动态常量池的区别?

静态常量池: 当class文件被JVM加载进来后存放在方法区的。
动态常量池(运行时常量池): class被JVM加载完,静池->动池。符号引用->转直接引用。

能直接转的:class的static method/private method,
Instance的contructor,super.methods。
第一次调用才会转:其余的。

在静态常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。