个人主页:五敷有你
系列专栏:并发编程
⛺️稳重求进,晒太阳
4.同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象
作用是在Java代码中去获取类的信息,以及存储静态字段的数据(JDK8之后)
使用JDK自带的hsdb工具查看Java虚拟机内存信息,工具位于JDK安装目录下lib文件夹中的sa-jdi.jar中
连接的第一个环节是验证,验证的主要目的是检验Java字节码文件是否遵守了《Java虚拟机规范》z中的约束,这个阶段一般不需要程序员参与
主要包含如下四个部分:(详细见Java虚拟机规范)
准备阶段为静态变量(static)分配内存并设置初始值。
每一种基本类型和引用都有初始值(防止之前出现数据残留)
解析主要是将常量池中的符号引用替换为直接引用
直接引用不再使用编号,而是使用内存中的地址进行具体的数据访问。
(添加-xx+TraceClassLoading 参数可以打印出加载并初始化的类)添加在JVM中
比如:几种情况是不会进行初始化指令执行的:
访问父类的静态变量,只会初始化父类
访问子类的静态变量,会先初始化父类
分析如下代码的运行结果
package jvm;
public class Test2 {
public static void main(String[] args) {
TestA[] testAS=new TestA[10];
}
}
class TestA{
static {
System.out.println("TestA执行类...");
}
}
jclasslib查看结果如下:并没有初始化
数组的创建不会导致数组中元素的类进行初始化