Java--JVM 运行流程
1.Java 类加载器(Java Classloader)
是 Java 运行时环境(Java Runtime Environment)的一个部件,负责动态加载 Java 类到 Java 虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java 运行时系统不需要知道文件与文件系统。对学习类加载器而言,掌握 Java 的委派概念是很重要的。每个 Java 类必须由某个类加载器装入到内存。Java 程序可以利用外部库(即由其他作者编写的软件库)。
2.双亲委派机制
Application 类加载器 -> Extension 扩展类加载器 -> Bootstrap 引导类加载器
当前类加载器需要加载 xxx 类时不会自己去直接加载,而是尝试将加载类这个任务向下传递给父加载器去完成,依次类推,直到了 Bootstrap 引导类加载器之后,会逐成加载类下来,形成向上检索,向下加载的形式。
好处:外部想要替代 jdk 的系统类,篡改它的实现时,因为父类加载器已经加载过 jdk 的系统类,子类加载器不会再加载,从而能在一定程度上保证了类加载的安全性。
3.JVM 运行流程生命周期:
加载阶段:加载 .class 文件到 JVM 内存
验证阶段:根据 JVM 规范验证 .class 是否合法
准备阶段:主要是给类分配内存空间,会计算出类需要占用多大的内存空间,并且设置初始化静态变量值阶段,比如默认布尔 flase 等。
解析阶段:把符号引用(被引用的类,方法或者变量还没有加载到内存中)改为直接引用(具有引用地址的指针,被引用的类,方法或者变量已经被加载到内存中)
初始化阶段:进行类初始化,包括静态代码块的执行,类的全局变量赋值操作
使用阶段:这个阶段类可以被 JVM 中的线程所使用了
卸载阶段:有些类不再被使用或者由于内存紧张,短期内不会使用到的类就会从 JVM 内存中移除,等下次需要再加载进来
4.对象初始化顺序
父类和子类的 final static 属性初始化
父类的 static 属性初始化、父类的 static 代码块执行
子类的 static 属性初始化、子类的 static 代码块执行
父类的非静态属性、父类的非静态代码块执行、父类的构造函数执行
子类的非静态属性、子类的非静态代码块执行、子类的构造函数执行
版权声明: 本文为 InfoQ 作者【是老郭啊】的原创文章。
原文链接:【http://xie.infoq.cn/article/6777b0b7b92adf63c1c8f3c78】。文章转载请联系作者。
评论