Java中,类的生命周期有五个阶段:
(1)加载:查找并获取类的class文件
(2)链接:将class文件加载到JVM中
(3)初始化:在JVM中根据class文件进行初始化,初始化只在类加载的时候执行一次
(4)调用,如创建实例
(5)卸载:运行结束,JVM对其进行清理
而基于习惯,我们将前三个阶段“加载、链接、初始化”并称为“加载”
如何跟踪加载下面,我们通过Idea中的命令对类的加载进行监控
以2021版idea为例进行演示,需要预先配置vm options
使用 -XX:+TraceClassLoading 监控类的加载
执行main()方法会加载类: 创建类的示例会被加载 类的生命周期未结束时,不会被加载 在继承关系的情况下,先加载父类,再加载子类 访问静态方法或静态变量,类会加载通过关键词搜索监控类
public class MyUtil { public static void makeMoney(){ System.out.println("工具人的makeMoney方法。。。"); } } public class TestLoad { public static void main(String[] args) { System.out.println("测试类的加载。。启动main方法"); MyUtil.makeMoney(); } }使用反射Class.forName()时,类会加载
加载final修饰的static属性的类Class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块
而ClassLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance()才会去执行static块
编译时就可以确定该值,访问时,无需加载该类
运行时才能确定该值,访问时,需要加载该类
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)