- 一、基础
- (一)层次关系:
- (二)层次作用:
- 1、Java程序→编译→Java字节码
- 2、Java字节码→JVM执行→ *** 作系统
- 3、 *** 作系统→编译→硬件
- (三)JVM分类
- 1、类加载子系统
- 2、 运行时数据区 [ 栈、堆、方法区 ]
- 1.方法区
- 2.堆(heap):线程共享、自动管理
- 3.栈(stack):顺序队列、自动管理
- 4.寄存器:线程
- 5.本地方法栈
- 3、执行引擎(JIT编译器、解释器)
- (四)JVM体系结构
- 1、class文件
- 2、类加载子系统
- 3、运行时数据区
- 4、执行引擎
- (五)流程
- 1、Java代码执行流程
- 2、Java代码编译执行过程
- 1.Java字节码生成过程:.class
- 2.字节码执行:JVM执行引擎
- (六)JVM生命周期
- (七)JVM运行模式
- 1、Server模式(重量级虚拟机):启动慢
- 2、Client模式(轻量级虚拟机):启动快
- 二、类加载:ClassLoader+子类
- (一)加载:加载
- (二)连接
- 1、验证:类(正确性)
- 2、准备:变量(分配空间)
- 3、解析:引用(可选)
- (三)初始化
- (四)使用
- (五)卸载
- 三、类加载器
- (一)分类
- 1、启动类加载器(引导类加载器):Bootstrap ClassLoader)
- 2、扩展类加载器:Extension ClassLoader
- 3、程序类加载器(系统类加载器): Application ClassLoader
- 4、自定义类加载器:User ClassLoader
- (二)类加载机制
- 1、全盘负责
- 2、父类委托
- 3、缓存机制
- (三)双亲委派模型
- 四、类执行:
- 五、JVM内存管理
- (一)线程私有:Thread Local
- (二)线程共享:Thread Shared
- 1、方法区(永久代)
- 2、堆内存(Heap)
- (三)直接内存:Direct Memory
- 六、线程
- (一)守护线程
- (二)非守护线程(普通线程):
JVM:JavaVirtualMachine:Java虚拟机
(一)层次关系:
JDK
JRE
JVM
*** 作系统
(二)层次作用:
1、Java程序→编译→Java字节码
2、Java字节码→JVM执行→ *** 作系统
执行java字节码:二进制
3、 *** 作系统→编译→硬件
(三)JVM分类
1、类加载子系统
2、 运行时数据区 [ 栈、堆、方法区 ]
1.方法区
2.堆(heap):线程共享、自动管理
散布:散点
堆:存储单位
区分电脑内存堆
存放内容:实例、new对象实例、this指针、数组
管理:垃圾回收器GC自动内存管理机制
3.栈(stack):顺序队列、自动管理
队列:顺序、连续
栈:运行时单位
区分电脑内存栈
公共基本数据类型:int
java方法——栈帧
压栈(栈帧)——出栈(栈帧)
4.寄存器:线程
指令地址
1个线程——1个寄存器
5.本地方法栈
native关键标注
3、执行引擎(JIT编译器、解释器)
JIT编译器(性能):编译执行
解释器(响应时间):逐行解释字节码
(四)JVM体系结构
1、class文件
入口:编译好字节码文件(编译器前端)
2、类加载子系统
经过:类加载子系统(字节码加载到内存生成class对象)
加载--->链接--->初始化
3、运行时数据区
4、执行引擎
解释器(解释运行)
jit及时编译器(编译器后端)
垃圾回收器三部分
(五)流程
1、Java代码执行流程
Class文件 → 装载(1) → 类加载器子系统 → 装载(2) → 运行时数据区
运行时数据区 ↔ 执行引擎 ↔ 本地方法接口 ↔ 本地方法库
运行时数据区 ↔ 本地方法接口 ↔ 本地方法库
2、Java代码编译执行过程
1.Java字节码生成过程:.class
源代码 → 词法分析器 → Token流 → 语法分析器 → 语法树/抽象语法树 → 语义分析器 → 注解抽象语法树 → 字节码生成器 → JVM字节码
2.字节码执行:JVM执行引擎
JVM字节码 → 机器无关优化 → 中间代码 → 机器相关优化 → 中间代码 → 寄存器分配器 → 中间代码 → 目标代码生成器 → 目标代码
(六)JVM生命周期
(七)JVM运行模式
1、Server模式(重量级虚拟机):启动慢
2、Client模式(轻量级虚拟机):启动快
客户端程序
二、类加载:ClassLoader+子类
Bootstrap ClassLoader
Extension ClassLoader
App ClassLoader
Custom ClassLoader
(一)加载:加载
类加载到内存
1通过一个类的全限定名来获取其定义的二进制字节流
2将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
3在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口
(二)连接
1、验证:类(正确性)
检查类的合法性
文件格式验证
元数据验证
字节码验证
符号引用验证
2、准备:变量(分配空间)
静态变量赋初始值
成员变量赋设定值
3、解析:引用(可选)
符号引用转换为直接引用
常量池内的符号引用替换为直接引用的过程(地址引用)
(三)初始化
静态变量赋设定值
1、父类的静态变量
2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法
隐式装载:new
显式装载:class.forName
类:系统类、扩展类、自定义类
(一)分类
1、启动类加载器(引导类加载器):Bootstrap ClassLoader)
2、扩展类加载器:Extension ClassLoader
3、程序类加载器(系统类加载器): Application ClassLoader
4、自定义类加载器:User ClassLoader
(二)类加载机制
1、全盘负责
2、父类委托
3、缓存机制
(三)双亲委派模型
四、类执行:
五、JVM内存管理
(一)线程私有:Thread Local
程序计数器PC
栈内存(VM Stack)
栈帧
异常
本地方法栈
(二)线程共享:Thread Shared
1、方法区(永久代)
运行时常量池
2、堆内存(Heap)
存储对象或数组
新生代
老年代
异常
(三)直接内存:Direct Memory
不受JVM GC管理
六、线程
(一)守护线程
gc(垃圾回收机制)
匿名守护线程
(二)非守护线程(普通线程):
main函数——java应用——java虚拟机
main函数1——java应用1——java虚拟机1
main函数2——java应用2——java虚拟机2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)