JVM虚拟机
文章目录

整体结构
Java代码的执行流程
架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构
基于栈的指令集架构
基于寄存器的指令集架构
栈:跨平台性、指令集小、指令多、执行性能比寄存器差
生命周期
启动
运行
结束
类加载子系统
内存结构概述
类加载器
类加载过程
加载(loadiing)——连接(linking)——初始化(initialization)
加载
连接
初始化
在初始化之前,所有的类中的变量被赋值为0(除final修饰之外),初始化时才会对变量进行赋值
任何一个类声明以后,内部至少存在一个类构造器
分类
引导类加载器(Bootstrap)
Java的核心类库都是由引导类加载器加载的
扩展类加载器(Extension)
系统类加载器(System)
自定义类加载器
方法
ClassLoader
类加载机制
双亲委派机制
优势
沙箱安全机制
其他
类的主动使用与被动使用
运行是数据区及线程
PC寄存器
举例
经典面试题
虚拟机栈(由栈帧组成)
优点
栈常见异常
设置栈内存大小
栈深入理解
栈存储什么
方法与栈帧一一对应。
运行原理
方法结束方式:1.以return方式结束 2.以未捕获处理异常的方式结束
(重点)栈帧组成——局部变量表+方法返回地址+操作数栈+动态链接
局部变量表结构(Local varivables)
局部变量与成员对象
所有方法在编译以后就确定了局部变量表的长度
slot理解——局部变量表的最基本单位
局部变量的值根据开始索引访问
long和double类型的变量需要占用两个存储的slot,所以这两个类型变量的访存按照第一个索引为准。
slot的重复使用
静态变量与局部变量对比
类变量:linking的prepare阶段,类变量默认赋值,initial阶段给类变量赋值即静态代码块赋值
实例变量:随着对象的创建会在堆空间中分配实例变量空间,并进行默认赋值
局部变量:必须进行显式赋值,否则编译无法通过
操作数栈
代码追踪操作数栈操作
栈顶缓存技术
动态连接(指向运行时常量池的动态引用)
字节码文件中存在一个常量池,用于存储所有的变量和方法的符号化信息,动态链接用于对常量池中方法的符号信息进行引用。
综合理解
方法调用理解
将方法的符号引用转换为调用方法的直接引用与方法的绑定机制
绑定:一个字段、方法或者类再符号引用被替换为直接引用的过程。
静态绑定(编译期间确定)
动态绑定(运行期间确定)
虚方法与非虚方法
非虚方法:如果方法在编译期间就确定了具体的调用版本,这个版本在运行时是不可变的
静态方法、私有方法、final方法、实例构造器、父类方法
虚方法:只能在运行时确定调用的方法
方法重写的本质
虚方法表
用于存放动态链接过程中的方法的实际入口,减少动态链接的次数,提高性能
方法返回地址
用于存放抛出寄存器的值,在方法退出后返回到该方法被调用的位置,继续调用该方法的指令的下一条指令的地址
用于将出栈栈帧的内容传递给下一个栈帧,即将栈帧额呢绒传递给下一个调用者
当方法正常返回时:
异常退出:
垃圾回收不会影响到虚拟机栈空间
本地方法栈
(重点)堆——线程共享
核心概述
进程(jvm实例,即一个jvm虚拟机对应一个进程)唯一!!!!!!!!
内存结构细分
堆空间大小设置
主要是设置年轻代和老年代的内存大小
开发中建议将初始堆内存与最大对内存设置为同样的值,为了防止扩容
OOM报错
超出堆内存
新生代与老年代中相关参数设置
对象分配一般过程
对象分配特殊情况
Minor GC Major GC Full GC对比
Minor GC
Major GC
Full GC
总结内存分配策略
-
如果对象在Eden出生并经过一次Minor GC之后仍然存活,并且能被Survivor容纳的话,被移动到Survivor空间中,并将对象年龄设置为1,对象在Survivor区中每经过一次Minor GC,年龄就会增加1,当它的年龄增加到一定程度(默认为15),就会被晋升到老年代。
-
对象晋升老年代的年龄阈值,可以通过 -XX:MaxTenuringThreshold来设置
TLAB
对象存储流程完善
堆空间常用参数设置
(重点)方法区(元空间)——线程共享
概述
方法区是独立于堆的一块存储空间
设置方法区大小
解决OOM
内部结构
类型信息
域信息
方法信息
全局常量 (static+final修饰)
每个全局常量在声明时就被分配完毕
class文件中常量池的理解
运行时常量池
静态变量和StringTable(存放在堆中)
垃圾回收行为
运行时数据区总结
对象实例化的方式
对象创建的步骤
对象内存布局
对象访问定位
直接指针
句柄访问
直接内存
IO | NIO |
---|---|
byte[] char[] | Buffer |
Stream | Channel |
直接内存大小设置
执行引擎
概述
程序的编译与解释
解释器
JIT编译器
解释器和JIT的选择
程序执行过程
HotSpot设置模式
JIT编译策略
本地方法接口与本地方法库
垃圾回收
概述
早期垃圾回收
Java自动内存管理
垃圾回收算法
标记阶段——引用计数算法
例如:循环链表,当节点的指针域指向自身时,其他对象没有引用改链表节点,但不会被回收
标记阶段——可达性分析算法
补充GCRoots
对象的finalization机制
垃圾回收之前的自定义处理机制
对象标记
清除阶段——清除算法
清除阶段——复制算法
指针域指向自身时,其他对象没有引用改链表节点,但不会被回收
标记阶段——可达性分析算法
[外链图片转存中…(img-UlF0zBDZ-1729329852421)]
[外链图片转存中…(img-DiaeT0a9-1729329852422)]
[外链图片转存中…(img-eDUlewev-1729329852422)]
补充GCRoots
[外链图片转存中…(img-YlokvRcE-1729329852422)]
[外链图片转存中…(img-2pEFSZAT-1729329852422)]
对象的finalization机制
垃圾回收之前的自定义处理机制
[外链图片转存中…(img-5AQsbXqA-1729329852423)]
[外链图片转存中…(img-GSqFY5vJ-1729329852423)]
[外链图片转存中…(img-gzMcnP1Z-1729329852423)]
对象标记
[外链图片转存中…(img-FunDcRTZ-1729329852423)]
清除阶段——清除算法
[外链图片转存中…(img-lW4sT6FQ-1729329852423)]
[外链图片转存中…(img-zeDhPvYn-1729329852424)]
清除阶段——复制算法
[外链图片转存中…(img-CHiA3Ykm-1729329852424)]