最近在看Java虚拟机,正好看到类加载这块,所以简单记录下所学到的知识,作为笔记。
首先,我们编写好的Java代码,经过编译变成.class文件,然后类加载器把.class字节码文件加载到JVM中,接着执行我们的代码,最后将类卸载出JVM。而从类加载到虚拟机到卸载出虚拟机的这一整个生命周期总共可以分为7个步骤,分别为加载、验证、准备、解析、初始化、使用和卸载,其中验证、准备和解析又称为连接阶段。接下来简单介绍下各个阶段是干嘛的。

加载是“类加载”的第一个阶段,就是将需要用到的类对应的.class字节码文件加载到虚拟机内存,并在方法区中生成一个java.lang.Class对象,作为程序访问这个类的各种数据的访问入口。

public class Test {public static void main(String[] args) {User user = new User();}
}

看一下上面这段代码,经过编译会生成两个字节码文件Test.class和User.class,接着会将包含main方法的这个类加载到虚拟机内存中开始执行,当执行到User user = new User(),发现需要用到User类,就会将User.class加载到内存中。所以简单的说,当需要用到哪个类时,就回去加载哪个类,Java的自带的核心类会在虚拟机启动时就会加载,包括包含main方法的启动类。但其实,类加载也挺复杂的,只是我了解的也不深,目前就理解成这样吧,后面再深入研究。

第二阶段验证,从字面上就可以看出这个阶段是来校验加载进来的.class文件中的内容是否符合规范,毕竟编译成.class文件后还是可以人为的对这个文件进行修改,那如果改的乱七八糟,压根不符合虚拟机的规范,那虚拟机就没法执行了,所以说这一步还是比较关键的。至于如何验证,还没有研究。

准备阶段我引用《深入理解Java虚拟机》中的一句话:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这也比较好理解,看下面一段代码:

public class Test {public static int value = 10;
}

当需要用到这个类时,会先将这个类加载到内存中,并验证字节码文件的合法性。验证通过后就会进行准备工作了,会为这个类中的类变量分配内存空间,就是上面的value变量,并给一个初始值,注意,仅包括类变量,不包括实例变量和局部变量等,并且只是给一个初始值,int型的初始值是0,所以准备过后,value的值是0,而不是10,而真正赋值为10是在初始化阶段。我还在其它资料上看到,这一阶段也会给这个类分配内存空间,先给类分配内存,在给它里面的类变量分配内存。

解析阶段是将常量池中的符号引用替换为直接引用的过程,这一部分内容我还没搞懂,所以这里就不过多记录了,简单了解一下。

初始化阶段是类加载中核心的一步了,还是以上面的代码为例,准备阶段我们已经为value变量分配了内存空间并给了初始值,现在就是真正给value赋值的时候,把10赋给了value。如果类中还含有静态代码块,也会在这一阶段执行。这里还要一点要注意,初始化类的时候,如果父类还没加载和初始化,也会触发父类的加载和初始化。

使用就没什么好说了,初始化完就可以开始使用这个对象了。

卸载是类的生命周期中的最后一阶段,即将方法区中无用的类回收,而类需要同时满足下面3个条件才算无用的类:

1、该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

同时满足上述3个条件的类即可回收,但不一定就会回收,可通过参数配置。

下面用一张图来简单展示类的加载流程:

以上就是Java类的加载过程,当然,只是简单的说明了一下,刚接触,还是有很多地方不清楚,先大概有一个这样的印象,后面再慢慢深入理解。

参考资料:
《深入理解Java虚拟机》
《从0开始带你成为JVM实战高手》

Java类加载过程简述相关推荐

  1. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  2. Java类加载过程内存分析

    Java类加载过程内存分析 Java类加载过程 编译 类的加载 类加载器 运行时数据区 执行引擎 Java类加载过程 具体过程如下: 编译 首先Java源代码会被编译器编译成class文件以供计算机执 ...

  3. Java类加载过程图解

    朋友给我发了一道有意思的题目,如下 为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同. 这就扯到基础理解上了,就是Java是如 ...

  4. java 类加载过程

    1. 使用命令行查看类加载过程,在eclipse测试类的run configuration中配置-verbose:class或者-verbose,如下图所示: 运行结果如下所示: [Opened D: ...

  5. java类加载过程_面试官:java类的加载过程

    Java 类加载机制 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类的加载 ...

  6. java类加载过程(双亲委派机制)

    类加载运行全过程 通过Java命令执行代码的大体流程如下: 其中loadClass的类加载过程有如下几步: 加载 >> 验证 >> 准备 >> 解析 >> ...

  7. Java类加载过程、为什么会出现JVM?

    目录 为什么会出现JVM? 编译和执行阶段(类加载过程) 编译阶段 主要的作用是什么? 编译的过程有哪些? 执行阶段 为什么会出现JVM? 我们学习Java的时候总是会听到这样一句话:Java程序可以 ...

  8. Java类加载过程详解

    类的生命周期 类的加载 类加载过程 加载 链接 验证 准备 解析 初始化 总结 首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1): 再详细具体一点(图2): 上面的图片有些地方看 ...

  9. java类加载过程,双亲委派机制

    1.双亲委派机制 Parent Delegation Model 又称为父级委托模型.想要了解它,还需理解类加载机制.类加载器.类加载器的层级关系. 2.类加载机制: 编译器把Java源文件编译成.c ...

最新文章

  1. PHP函数-网络函数
  2. 字符串按单词逆序输出c 语言,字符串中的每个单词倒序输出问题
  3. toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
  4. ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(1)
  5. XSS(跨站脚本攻击)攻击与防御
  6. TensorFlow 多任务学习
  7. 序列每天从0开始_【算法打卡】分割数组为连续子序列
  8. Kubernetes知识体系-从入门到精通
  9. Liunx系统命令sed的使用
  10. quartus仿真25:JK触发器构成的模7计数器(分析)
  11. ie6和W3C的盒子模型
  12. java oom分析_记录一次OOM分析过程
  13. 用python做计算器(超级版)
  14. AdventNet Agent Toolkit C Edition6 AGENT
  15. md文件 markdown打开工具(typora)
  16. matlab数据平滑处理,matlab数据的平滑处理
  17. No qualifying bean of type [com.service.UserService] found for dependency: 解决方案
  18. 找出n以内最大的质数。python
  19. 9.数据中台 --- 数据服务体系建设
  20. OpenStack Nova hacking和读书笔记

热门文章

  1. win10系统下部分软件主界面显示不正常(工具栏显示太小)问题解决办法
  2. nodejs操作图片
  3. lumion的物体系统5.30
  4. 9. 创业 - 业绩
  5. 星球日报 | 香港版支付宝AlipayHK已实现区块链跨境、汇款等一系列新升级
  6. MySQL数据库创建索引的方法和好处
  7. 学习Photoshop的一点心得
  8. (附源码)springboot服装购物网站 毕业设计 010234
  9. Socially-Aware Self-Supervised Tri-Training for Recommendation
  10. 【Elasticsearch教程18】Mapping字段类型之text 以及term、match和analyzer