「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
JVM的加载过程
我们写好的java代码,怎么就在计算机里运行起来了?
他经历了什么样的过程
.java -> .class -> 类加载过程 -> JVM
看看从main()入口,到虚拟机,会经历什么
1.1 编译
将Java 编译成 Class 文件
1.2 类加载
将Class 加载进虚拟机中
1.2.1 加载过程
加载->验证->准备->解析->初始化->使用->卸载
(1)验证阶段:更具java虚拟机规范,校验加载进来的class是否符合规范
(2)准备阶段:为类、变量分配内存空间,并赋给默认值
(3)解析阶段:符号引用替换为直接引用
初始化这个类之前,父类还没加载和初始化,先加载父类,并且初始化之后才完成
1.2.2 类加载器
启动类加载器 -> 扩展类加载器 -> 应用程序类加载器 -> 自定义类加载器
(1)启动类加载器
Bootstrap ClassLoader,负责加载java目录下的核心类(“lib”目录)
(2)扩展类加载器
Extension ClassLoader,负责加载java目录下的“lib/ext”目录
(3)应用程序类加载器
Application ClassLoader,负责加载“class Path”环境变量指定的路径中的类
(4)自定义类加载器
加载自己定义的类
双亲委派机制
类加载器有亲子层级结构,从启动类-》扩展类-》应用程序类-》自定义类加载器一层一层
通俗的来说,就是叫老子(启动类加载器)去找东西,老子没找到,踢回儿子(扩展类加载器)哪里继续找,儿子找不到,踢到孙子(应用程序类加载器)哪里找,再找不到,只能自己曾孙找找(自定义类加载器)。