概述
目录
前言
JVM是什么?
JVM的结构
认识类加载子系统(ClassLoader)
加载(Loading)
链接(Linking)
初始化(Initialization)
问题思考
前言
工作这么多年经常听到JVM这个东西,然而却一直没有好好去理解。因此本次来好好解读一下JVM。由于JVM的内容比较多所以将分为四个章节记录。而本篇是Java虚拟机的开篇,主要是初步认识一下JVM。
JVM是什么?
Java虚拟机(Java virtual machine),是用来执行字节码文件指令的虚拟机。它可以让Java编译出来的文件在不同的操作系统上运行,这也就是所谓的跨平台运行。
JVM的结构
那么Java虚拟机到底长啥样呢?它有哪些内容?我们通过一张图来初步看看Java虚拟的结构。
- ClassFiles:class文件
- 类加载子系统:用于加载class文件的子系统。
- 运行时数据区域:
对象区域:存放对象结构的区域,比如常量池、成员变量、方法代码及方法数据。
堆:运行时数据区域用于给对象分配空间。
栈:Java存储栈框架;控制本地变量和部分结果,管理一部分方法的调用与返回。每创建一个线程都会开辟一个私有的虚拟栈空间
本地方法栈:包含应用的所有本地方法。
计数器:
4. 执行引擎
即时编译器:Just-In-time compiler。
垃圾回收器:自动回收未引用的对象,核心模块,里面包含了垃圾回收器和垃圾回收算法。
5. 本地方法接口:Java Native Interface(JNI)框架,提供调用其他语言(C/C++)实现的应用程序的接口。Java使用JNI实现与控制台及操作系统的交互功能。
6. 本地方法库
认识类加载子系统(ClassLoader)
首先看一下类加载子系统的生命周期,如下图:
加载(Loading)
工作原理是使用类加载器结合双亲委派机制将Class文件和Jar加载进来。
类加载器有两种类型:
1.JVM提供的bootstrap类加载器:
- 系统应用类加载器(appClassLoader):主要加载当前应用的ClassPath
- 推展类加载器(extClassLoader):主要加载%JAVA_HOME%/jre/lib/ext
- 启动类、根类加载器(BooststrapClassLoader):主要加载%JAVA_HOME%/lib
public class ClassLoaderMain {
public static void main(String[] args) {
//自定义class
DemoJvm demoJvm = new DemoJvm();
//拓展目录class
EncoderFactory factory = new EncoderFactory();
//启动类class
String string = new String("");
//返回结果: sun.misc.Launcher$AppClassLoader
System.out.println(demoJvm.getClass().getClassLoader().getClass().getName());
//返回结果: sun.misc.Launcher$ExtClassLoader
System.out.println(factory.getClass().getClassLoader().getClass().getName());
//返回结果: null (根类加载器为null)
System.out.println(string.getClass().getClassLoader());
}
}
2.用户自定义类加载器:用户自定义类加载器是一个继承了ClassLoader抽象类的对象。主要加载本地磁盘或网络的类。
双亲委派机制
双亲委派实质上就是上面所提及的4种类加载器在加载类之前不会立即由当前类加载器加载,而是先询问其上一层类加载器是否加载过对应类,若上层类加载器反馈当前类加载器没有加载过其需要加载的类,则当前类加载器才会向其所加载的目录寻找该类。 此过程是逐层往上询问的直至找到类否则返回ClassNotFoundException。通过以下流程可以了解双亲委派机制。
链接(Linking)
在加载阶段结束之后JVM就进入链接阶段。链接阶段其实是做了很多工作的,具体什么工作感兴趣的同学可以深究。此处简单说说几个主要工作。
验证
验证过程中JVM会检查class二进制文件是否符合JVM规范。
准备
准备阶段所作的工作是创建及初始化类或接口的静态变量。
解析
解析是从运行时常量池中的符号引用动态确定具体值的过程。比如类,字段及方法等解析(官方文档翻译,后续需重新理解)
初始化(Initialization)
初始化类或接口其中包括执行初始化方法。
注:若感兴趣想深入研究类加载器的内容可参考官方文档。[官网链接]
问题思考
如何创建自定义类加载器?
如何通过自定义类加载网络上的Class文件?
参考文章:
JVM | Java Virtual Machine - Javatpoint
Chapter 5. Loading, Linking, and Initializing
最后
以上就是称心彩虹为你收集整理的Java学习笔记之JVM(一)前言JVM是什么?JVM的结构认识类加载子系统(ClassLoader)问题思考的全部内容,希望文章能够帮你解决Java学习笔记之JVM(一)前言JVM是什么?JVM的结构认识类加载子系统(ClassLoader)问题思考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复