jvm(一)类的加载,连接,初始化简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwkxq/article/details/55806340
1.JVM和类
	调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,
	们都处于该Java虚拟机进程里,共享该JVM进程的内存区。
	
	当系统出现以下几种情况时,JVM进程将被终止:
		程序运行到最后正常结束;
		程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序;
		程序运行过程中遇到未捕获的异常或错误而结束;
		程序所在的平台强制结束了JVM进程。
2.类的加载步骤(一般下列3个步骤是连续执行的,所以有时也将下列3个步骤一起统称为类的加载或者初始化)
	1.加载:查找并加载类的二进制文件(class文件,由类加载完成)
		即:
		将class文件中的二进制字节码数据从硬盘加载到内存,
		并将数据存放在运行时数据区的方法区中,
		然后在堆区创建一个java.lang.Class对象用于描述类在方法区的数据结构。
		
		完成加载步骤有如下5种方式:
			1.1 从本地系统加载(java xxxx)
			1.2	从jar或者zip等归档文件中加载(将其添加到 build path)
			1.3	通过网络下载方式加载(使用java.net.URLClassLoader来做)
			1.4	动态编译源文件方式加载(少见)
			1.5	从专有数据库提取class文件方式(少见)
	
	2.连接:将已经加载到内存中的二进制数据合并到jvm运行时环境中去(例如 类的继承,实现,相互调用等)
		2.1	验证	:确保加载类的正确性(防止加载的class不是通过javac生成的)。
		2.2	准备:为类的静态变量分配内存,并将改变量初始化成默认值。
		2.3	解析:将类中的符号引用转换成直接引用
	
	3.初始化:为类的静态变量赋予实际的值(如 static int a=3; 实际上是先通过准备阶段赋值成0,最后在初始化成3的)
	*只有在java程序对类首次“主动使用”类才会执行初始化工作。
	
3.类的主动使用与被动使用
	3.1 主动使用:包括以下6种情况:
		3.1.1	创建类的示例(new A())
		3.1.2	访问类或接口的静态变量(或者对静态变量赋值,如:A.num, A.num = 3)
		3.1.3	反射方式加载类(如 Class.forName("xxxx"))
		3.1.4	子类被主动使用的类(class A extends B{},A.num; 则称B被主动使用了)
		3.1.5	jvm启动时被标记为启动类的类(java Test	则称 Test类被主动使用了)
		3.1.6	访问类的静态方法(A.method())
	3.2 被动使用:除了主动使用的情况

猜你喜欢

转载自blog.csdn.net/qwkxq/article/details/55806340