java虚拟机jvm

305 阅读3分钟

java虚拟机jvm -生命周期结束 1.执行System.exit()方法 2.程序正常执行结束 3.程序在执行过程中遇到异常或因错误而抛异常终止 4.由于操作系统出现错误而导致java虚拟机进程终止

-执行流程
加载:查找并加载类的二进制数据
连接:
	验证被加载类的正确性
	准备为类的静态变量分配内存,并将其初始化为默认值
	解析将类中的符号引用,转换为直接引用
初始化:为静态变量赋值正确的初始值

-java对类的使用方式:主动使用和被动使用。并且在java虚拟机对每个类的初始化,只有在java程序的首次主动使用后才进行。
主动使用 - 对类进行初始化
	创建类的实例
	对访问的静态变量赋值
	调用类的静态方法
	反射
	初始化类的子类
其他对类的使用都不会对类进行初始化

-类的加载---最终的产品---->堆区中的class对象(包含了方法区的数据结构,也提供了可以访问方法区数据结构的接口)		
	将类的.class文件中的二进制数据读入内存(数据区的方法区内)中,然后再堆区创建一个java.lang.class对象,封装方法区内的数据结构。
	加载.class的方式
		从本地系统中直接加载
		通过网络下载.class文件
		从zip,jar等归档文件中加载.class文件
		从专有数据库中提取.class文件
		从java源文件动态编译为.class文件

-常用两种的类加载器:
	1.java虚拟机自带的加载器
		-根类加载器(bootstrap)
		-扩展类加载器(extension)
		-系统类加载器(system)
	2.用户自定义的类加载器
		-java.lang.ClassLoader的子类
		-定制类的加载器
	使用场景:不需要在类的首次主动使用时再加载塔,允许在预料到要是用某个类之前就开始加载。如果加载不到这个类会报告错误(linkageerror错误),不存在的类未被使用就不会报错。
	
-类加载之后:
	进入了连接阶段,会将已经读入内存的二进制数据合并到虚拟机的运行环境中。
	注意:类的验证过程:

-静态变量初始化的两种途径:1.在静态变量声明处进行初始化,2.使用静态块进行初始化

-类加载的次序(父亲委托机制):每次加载class都先从父类开始加载,然后再从子类。(除了根加载器。每一种加载器都有一个父类的加载器),如果都加载不到,就会抛出clasnotfoundexception的异常。若有一个加载器加载成功,则这个加载器称为定义类加载器,返回对象的类加载器(参与的加载器)称为初始类加载器。
	优点:能够提高软件系统的安全性。