写点什么

Java--JVM 运行流程

用户头像
是老郭啊
关注
发布于: 2021 年 06 月 08 日
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 运行流程生命周期:
  1. 加载阶段:加载 .class 文件到 JVM 内存

  2. 验证阶段:根据 JVM 规范验证 .class 是否合法

  3. 准备阶段:主要是给类分配内存空间,会计算出类需要占用多大的内存空间,并且设置初始化静态变量值阶段,比如默认布尔 flase 等。

  4. 解析阶段:把符号引用(被引用的类,方法或者变量还没有加载到内存中)改为直接引用(具有引用地址的指针,被引用的类,方法或者变量已经被加载到内存中)

  5. 初始化阶段:进行类初始化,包括静态代码块的执行,类的全局变量赋值操作

  6. 使用阶段:这个阶段类可以被 JVM 中的线程所使用了

  7. 卸载阶段:有些类不再被使用或者由于内存紧张,短期内不会使用到的类就会从 JVM 内存中移除,等下次需要再加载进来


4.对象初始化顺序
  1. 父类和子类的 final static 属性初始化

  2. 父类的 static 属性初始化、父类的 static 代码块执行

  3. 子类的 static 属性初始化、子类的 static 代码块执行

  4. 父类的非静态属性、父类的非静态代码块执行、父类的构造函数执行

  5. 子类的非静态属性、子类的非静态代码块执行、子类的构造函数执行


发布于: 2021 年 06 月 08 日阅读数: 16
用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
Java--JVM运行流程