首页
编程随笔
Java笔记
Html/Css/Js
Android
后端笔记
服务器搭建
BUG收集
Java异常
Android异常
在线工具
Json格式化
编码/解码
Epub在线编辑
登录
发布文章
个人文章
退出登录
首页
技术教程
BUG收集
在线工具
资源下载
登录
发布文章
退出登录
搜索
当前位置:
首页
-
博客
- 正文
关闭
JVM知识快速复习
更新时间:2022-03-28 22:16:08
阅读数:848
发布者:落幕
## 1、Java代码执行流程 [![Java代码执行流程](https://www.speechb.com/blog/Java%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B%E7%AE%80%E5%8D%95%E7%89%88%E6%9C%AC.jpg "Java代码执行流程")](https://www.speechb.com/blog/Java%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%B5%81%E7%A8%8B%E7%AE%80%E5%8D%95%E7%89%88%E6%9C%AC.jpg "Java代码执行流程") ## 2、类加载子系统 ### 2.1 类加载过程 ![类加载过程](https://www.speechb.com/blog/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B.png "类加载过程") #### 链接阶段 ##### 验证(Verify): 目的在子确保 Class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。 ##### 准备(Prepare): 为类变量分配内存并且设置该类变量的默认初始值,即零值。 这里不包含用 final 修饰的 static,因为 final 在编译的时候就会分配了,准备阶段会显式初始化; 这里不会为实例变量分配初始化,类变量((即cinit阶段,调用类的构造方法))会分配在方法区中,而实例变量是会随着对象一起分配到 Java 堆中。 ##### 解析(Resolve): 将常量池内的符号引用转换为直接引用的过程。 事实上,解析操作往往会伴随着 JVM 在执行完初始化之后再执行。 符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java 虚拟机规范》的 Class 文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的 CONSTANT_Class_info,CONSTANT_Fieldref_info、CONSTANT_Methodref_info 等。 ### 2.2虚拟机自带的加载器 ![双亲委派](https://www.speechb.com/blog/%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE.jpg "双亲委派") (1)启动类加载器(引导类加载器,Bootstrap ClassLoader) 这个类加载使用 C/C++语言实现的,嵌套在 JVM 内部。 它用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar 或 sun.boot.class.path 路径下的内容),用于提供 JVM 自身需要的类 并不继承自 ava.lang.ClassLoader,没有父加载器。 加载扩展类和应用程序类加载器,并指定为他们的父类加载器。 出于安全考虑,Bootstrap 启动类加载器只加载包名为 java、javax、sun 等开头的类 (2)扩展类加载器(Extension ClassLoader) Java 语言编写,由 sun.misc.Launcher$ExtClassLoader 实现。 派生于 ClassLoader 类 父类加载器为启动类加载器 从 java.ext.dirs 系统属性所指定的目录中加载类库,或从 JDK 的安装目录的 jre/1ib/ext 子目录(扩展目录)下加载类库。如果用户创建的 JAR 放在此目录下,也会自动由扩展类加载器加载。 (3)应用程序类加载器(系统类加载器,AppClassLoader) java 语言编写,由 sun.misc.LaunchersAppClassLoader 实现 派生于 ClassLoader 类 父类加载器为扩展类加载器 它负责加载环境变量 classpath 或系统属性 java.class.path 指定路径下的类库 该类加载是程序中默认的类加载器,一般来说,Java 应用的类都是由它来完成加载 通过 ClassLoader#getSystemclassLoader() 方法可以获取到该类加载器