Jvm Java虚拟机学习

发布时间 2024-01-07 20:11:01作者: Only_Aptx-4869

Jvm Java虚拟机学习

内存模型

先由类装载子系统 把 class 文件装载到运行时数据区(.java ->.class)

运行时数据区包括 (堆,栈(线程),本地方法栈(运行 native修饰的方法时 的数据区 ),方法区元空间(常量+静态变量+类信息 such as :静态对象user的引用地址),程序计数器)

当main线程进jvm时 怎么执行代码?

程序计数器 = 4,4是怎么来的 就是把class文件 反汇编 记录代码中下一步该执行哪行

FILO 栈(线程)stack的内存模型

特点:先进后出,为什么要用栈 因为方法调用子方法 肯定是子方法执行完被干掉,然后执行父方法

存放多个栈帧{
compute()-栈帧:[局部变量表,操作数栈,动态链接,方法出口],
main()-栈帧
}
解析:

1、局部变量表 存放的是局部变量[a =1,b=2]
2、如果局部变量是对象math,因为对象存在堆内存中 局部变量表 存math对象的引用地址

操作数栈

存放局部变量运算后的结果 (a+b)* 10 = 30;由字节码执行引擎动态修改

动态链接

在代码中我们要调用a();a方法在内存中的地址 就是动态链接

方法出口

运行完子方法后,找到下一行运行的代码
字节码执行引擎

堆heap的内存模型

年轻代(1/3):
伊甸园区:存放 第一次创建的对象,空间满了进行gc:
垃圾回收过程:由字节码执行调用垃圾收集线程:mirror gc
可达性分析算法:将GC Roots对象作为起点 从这些节点开始往下搜索引用对象 找到的对象标记为非垃圾,其余未标记的都是垃圾对象
GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等
survivor区(幸存者):非垃圾对象
老年代(2/3):当gc次数大于15时的对象 会进入老年代,老年代区域满的话 进行full gc()
full gc:对整个堆内存回收 如果整个堆内存满了,会发生OOM!