JVM类加载

                        JVM类加载过程与步骤的一些细节

首先,你需要知道:
在Java代码中,类型的加载、连接与初始化过程都是在程序运行期间所完成的。
好处:提供了更大的灵活性,增加了更多的可能性。

Java虚拟机与程序的生命周期
如下几种情况,Java虚拟机将结束生命周期:
执行了System.exit()方法
程序正常执行结束
程序在执行过程中遇到了异常或错误而异常终止
由于操作系统出现错误而导致Java虚拟机进程终止

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

注意:连接过程中的准备阶段只是默认值,例如public static int a=1;会先将0赋值给a
Java程序对类的使用方式可分为两种:
-主动使用 -被动使用
所有的Java虚拟机实现必须在每个类或接口被Java程序“”首次主动使用“”时才初始化
即第一次主动使用才会被初始化,换言之初始化只会执行一次

主动使用(七种):
1.创建类的实例
2.访问某个类或接口的静态变量(JVM助记符:getstatic),或者对该静态变量赋值(putstatic)
3.调用类的静态方法(invokestatic)
4.反射(Class.forName(“com.test.Test”))
5.初始化一个类的子类(class Parent{ } class Child extends Parent{ } 初始化child类时parent也会被初始化)
6.Java虚拟机启动时被标明为启动类的类(换句话说就是包含main方法的类程序入口,例 Java Test)
7.JDK1.7开始提供的动态语言支持:
java.lang.invoke. MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应
的类如果没有初始化,则初始化
除了以上七种,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化(加载、连接阶段都有可能)

类的加载:指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后再内存中
创建一个java.lang.Class对象 (JVM规范并未说明class对象位于哪里,Oracle的Hotspot虚拟机将其放在了方法区)
用来封装类在方法区内的数据结构

一个类不管生成了多少个实例,所有这些实例所对应的字节码文件对象只有一份(反射)

加载.class文件的方式:
1、从本地系统中直接加载
2、通过网络下载.class文件
3、从zip,jar等归档文件中加载.class文件
4、从专有的数据库中提取.class文件
5、将Java源文件动态的编译为.class文件(动态代理,jsp)
动态代理是这个类是在运行期才生成,编译时不存在该类
jsp会被转换为一个servlet,servlet是一个Java类,因此servlet会被编译成.class文件被虚拟机所加载

例子:
在这里插入图片描述
在这里插入图片描述
解释:图1中父类myparent1定义了str,我们对父类进行了主动使用,虽然说引用的方式是通过子类的名字进行引用,但是真正是谁定义的静态变量就表示对谁的主动使用,所以子类不会被初始化,静态代码块不会执行;图2显然str1是在子类中定义的,所以子类被主动使用,但是根据上面所讲的7种情况中,初始化一个类的子类的同时该类也会被初始化,并且父类先行被初始化

疑问:我们知道图1中子类没有执行初始化过程,那么有没有被JVM加载呢?
我们来利用虚拟机参数来获取我们想要的信息
-XX:+TraceClassLoading,用于追踪类的加载信息并打印
在这里插入图片描述
下面是运行后的一些信息:
在这里插入图片描述
我们可以得到以下结论:子类确实有被JVM加载,并且最先加载的是MyTest1,因为它作为程序的一个入口,正如上面提到的主动加载情况中的其中一种情形,即是程序的启动类(main方法),其次再加载父类,最后加载子类这样的这样一个顺序执行

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值