描述jvm如何加载class字节码文件。
保证字节流的信息符合jvm规范。(jvm的自我保护机制)
正常运行java程序可以通过.java编译成class文件,然后交由jvm执行。编译器虽然本身可以检测java的安全问题。但是除了编译产生字节码文件之外,还可以通过其他途径产生,比如直接编写字节码文件或者通过第三方无编译检查的编译器生成。
jvm验证包括四个方面:
文件格式验证
版本号是否能被当前版本的虚拟机执行
检查字节流是否有被删除或者附加的信息
....
元数据验证
检测当前类是否有父类,是否继承了final修饰的类,是否重写了final修饰的方法
字节码验证
主要对方法体进行验证,避免由于方法运行时造成虚拟机崩溃。
符合引用验证
发生在符合引用转换为直接引用的时候。
符号引用于直接引用的区别:符号引用可以理解为一个字符串,是静态的,也就是在程序未执行之前对类,方法等的表示。等程序执行的时候,会在内存中将符号引用转换为直接引用,真正的执行方法,完成类之间的调用。【举个栗子】我是特种兵系列一度热播,其中集训时候的编号就和直接引用很类似。参加集训之前每个人都有一个自己的名字,但是为了方便管理,集训的时候就会把名字和编号进行一个映射。使用编号更便于管理和统计。自己的名字就是一个符号引用,集训时候的编号就是一个直接引用。
为类变量分配内存。
类变量:static修饰的静态变量
将常量池中的符号引用替换成直接引用。发生时间不可预料,有可能和初始化阶段互相交换位置。
双亲委派模型的本质目的是为了避免类的重复加载,用代码类比的话,是为了实现代码复用。
【举个例子】每个类都有一个共同的父类object,每个类在被加载时都会先去加载object类,按照双亲委派模型的思路,所有的类都会优先被启动类加载器加载,那么也就是说只需要加载一次object,当其他类需要object时,直接返回已经加载过的object.class。
如对本文有疑问, 点击进行留言回复!!
荐 嵌入式linux开发环境搭建(Docker版,基于iTop 4412开发板)
SpringBoot项目部署到服务器之 Liunx环境安装jdk详细步骤
网友评论