深入理解Java虚拟机
2022-09-21 21:38:43 0 举报
AI智能生成
JVM思维导图
作者其他创作
大纲/内容
.Class文件
类
版本
字段
方法
接口
常量信息表
字面量
符号引用
第二部分
Java内存区域与内存溢出异常
运行时数据区域
方法区 Method Area
作用
异常
如果方法区无法满足新的内存分配需求时;OutOfMemoryError
运行时常量池
作用
异常
当常量池无法再申请到内存时会抛出OutOfMemoryError
堆 Heap
作用
异常
分配实例时没有内存,并且扩展失败时;OutOfMemoryError
虚拟机栈 VM Stack
异常
(1)线程请求的栈深度大于虚拟机所允许的深度;StackOverflowError
(2)若Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存;OutOfMemoryError
作用
本地方法栈 Native Method Stack
作用
异常
(1)栈深溢出:StackOverflowError
(2)内存扩展失败:(OutOfMemoryError)
程序计数器 Program Counter Register
异常
没有规定OutOfMemoryError
作用
直接内存
异常
各个内存区域总和大于物理内存限制;OutOfMemoryError
对象的创建
创建方式
new
1.类加载过程
2.分配内存
内存分配方式
1.指针碰撞
Serial
Parnew
2.空闲列表
Subtopic
对象的内存布局
在堆内存中
对象头
自身运行时数据
HashCode
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
类型指针
实例数据
各种类型的字段内容
父类继承的和子类定义的字段
对齐填充
垃圾收集器与内存分配策略
对象的访问定位
指针
句柄
判断对象已死的方法?
1.引用计数算法
2.可达性分析算法
固定作为GC Roots的对象
1.在虚拟机栈种引用的对象
2.在方法区种类静态属性引用的对象
3.在方法区中引用的常量对象
4.在JNI种引用的对象
5.Java虚拟机内部的引用,如基本数据类型对应的Class对象、常驻异常对象、系统类加载器
6.所有被同步锁(Synchronized)持有的对象
7.反应Java虚拟机内部情况的JMXBean、JVMTI种注册的回调、本地代码缓存等
回收方法区
判断常量是否“废弃”(三者同时满足)
1.该类所有实例的都被回收
2.加载该类的类加载器已经被回收
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法通过反射访问该类的方法
垃圾收集算法(判断对象消亡的角度)
引用计数器式垃圾收集
追踪式垃圾收集
垃圾收集算法
1.标记-清除算法
缺点
1.执行效率不稳定
2.内存空间的碎片化问题
2.标记-复制算法
缺点
可用内存变为1/2
3.标记整理算法
垃圾收集器
经典垃圾收集器
Serial收集器
特点
单线程收集器
新生代采用复制算法暂停所有的用户线程
老年代采用标记整理算法暂停所有用户线程
ParNew收集器
特点
Serial收集器的多线程并行版本
新生代采用复制算法暂停所有用户线程
老年代采用标记-整理算法暂停所有用户线程
Parallel Scavenge收集器
特点
基于标记-复制算法实现
多线程收集器
核心:控制吞吐量
Serial Old收集器
特点
单线程收集器
标记-整理算法
CMS收集器
特点
1.初始标记(单线程)
2.并发标记
3.重新标记(单线程)
4.并发清除
缺点
1.对处理器资源非常敏感
2.无法处理“浮动垃圾”
3.会产生大量的空间碎片
类文件结构
Class类的文件结构
魔数与Class文件的版本
魔数:4字节 0xCAFEBABE
5,6次版本号
7,8主版本号
常量池
字面量
文本字符串
final的常量值
符号引用
被模块导出或者开放的包(Package)
类和接口的全限定名Full Qualified Name
字段的名称和描述符 Descriptor
方法的名称和描述符
方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)
动态调用点和动态常量(Dynamically-Computed Call Site、Dynamically-Computed Constant)
访问标志
用于识别类或者接口的访问信息
类索引、父索引与接口索引集合
字段表集合
1.表示字段的作用域(private、public、protected)
2.实例变量还是类变量(static)
3.可变性(final)
4.并发可见性(volatile)
5.可否被序列化(transient)
6.字段数据类型(基本类型、对象、数组)
7.字段名称
方法表集合
1.标志
2.名称索引
3.描述符索引
4.属性表集合
属性表集合
1.Code属性
2.Exceptions属性
作用:列举出方法中可能抛出的受查异常
3.LineNumberTable属性
存储字节吗与Java源文件之间的偏移量
4.LoaclVariableTable及LocalVariableTypeTable属性
LoaclVariableTable用于描述栈帧种局部变量表的变量与Java源码中定义的变量关系
LocalVariableTypeTable属性仅仅把记录的字段描述符的descriptor_index替换成了字段的特征签名
5.SourceFile及SourceDebugExtension
SourceFile用于记录生成这个Class文件的源码文件名称
SourceDebugExtension用于存储额外的代码调试信息(一个类种只允许存在一个)
6.ConstantValue属性
通知虚拟机自动为静态变量赋值(只有Static修饰的变量才可以使用这项属性)
7.InnerClass属性
记录内部类与宿主类的关联
8.Deprecated属性及Synthetic属性
Deprecated:用于表示某个类、字段或者方法
Synthetic:编译器生成的字段或者方法
9.StackMapTable 属性
10.Signature属性
11.BootstrapMethods属性
子主题
12.MethodsParameters属性
记录方法的各个形参名称和信息
13.模块化属性
14.运行时注解相关属性
虚拟机类加载机制
1.类的加载时机
1.加载
2.验证
1.文件格式验证
2.元数据验证
3.字节码验证
4.符号引用验证
3.准备
4.解析
1.类或接口解析
2.字段解析
3.方法解析
4.接口方法解析
5.初始化
6.使用
7.卸载
4.类加载器
1.类与类加载器
2.双亲委派模型
1.启动类加载器
2.扩展类加载器
平台类加载器
3.应用程序类加载器
自定义类加载器
虚拟机字节码执行引擎
运行时栈帧结构
1.局部变量表
2.操作数栈(操作栈)
3.动态链接
静态解析
动态连接
4.方法返回地址
正常调用
PC计数器的值就可作为返回地址,保存在栈帧中
抛出异常
恢复上层方法的局部变量表和操作数栈
方法调用
1.解析
静态分派
2.分派
静态分派
(重载overloading)
动态分派
重写override
单分派和多分派
收藏
0 条评论
下一页