JVM内存模型-彻底分析-jdk1.8
2021-10-25 22:47:19 0 举报
针对jdk1.8(hotspot)的jvm内存模型机型彻底分析
作者其他创作
大纲/内容
字节码执行引擎
一个方法对应一块栈帧内存区域
JVM虚拟机 JDK8
2
动态链接
方法出口
main函数一执行则开辟一份栈内存执行这块代码
1
一块8G内存条堆分配:5G栈可用:8-5G方法区可用:8-5-栈使用
Eden与Survivor区默认8:1:1 大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活 的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回 收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可, JVM默认有这个参数-XX:+UseAdaptiveSizePolicy(默认开启),会导致这个8:1:1比例自动变化,如果不想这个比例有变 化可以设置参数-XX:-UseAdaptiveSizePolicy
初始21MB触发full gc阈值
3
程序计数器
(局部变量2)
this
记录图中code
堆
STW (stop the work)
线程2
Windows
本地方法栈
cpu寄存器
C++实现
栈(线程)stack和数据结构栈一样
Math math = new Math();
math 指针
局部变量表
栈(线程)
为什么JVM需要设置 STW机制?为了在进行 GC的时候,可以锁定找到的那些非垃圾对象然后将他们移动到对应的区域后,再进行垃圾回收
独立内存
老年代(2/3)
=
JVM虚拟机分为三块1、类加载器2、运行时数据区3、字节码执行引擎
操作数栈
Linux
计算过后,1和2在操作数栈销毁
STW机制的用例
栈帧可以隔离变量
程序计数器(pc寄存器 非cpu寄存器)
方法compute()-栈帧
Math.java(自己写的java类)
int a = 1; int b = 2; int c = (a + b) * 10;
+
年轻代
运行时数据区(内存模型-物理内存)
当元空间被分配满则会直接触发 full gc
局部变量0:默认this
c = 30
堆-Xmx 小-Xmx 大
方法区(元空间)-XX:MetaspaceSize-XX:MaxMetaspaceSize
Minor GC/Young GC
(局部变量1)
Math.class
JVM这三个背景色的是线程独立占用内存
b =2
S0(1/10)
javac
(局部变量0)
栈(线程1)-Xss
独立直接内存
栈(线程)FILO
修改程序计数器
新生代-Xmn
a =1
不是栈结构
也是栈结构自底向上
方法main() - 栈帧
对于64位JVM 默认21M默认元空间的大小是无限制的
记录class文件执行到哪个位置
(局部变量3)
Survivor 区
即使对于同一份代码,不同线程处理,都会新开辟一份内存
堆heap
水平伸缩机制
S1(1/10)
假如这段代码每次执行时都会在栈帧上开辟一块内存,随着最后一个\"}\"结束后,user对象的gc root引用失效当发生STW时,该代码还未执行结束,即 user 仍旧被 gc root在引用着这时候无法被回收,在gc后,该程序继续执行,继续开辟内存
Eden(8/10)
Major GC/Full GC
多线程时当cpu被其他线程抢占过去时,此时通过程序计数器记录当前执行位置挂起当前线程方便后面再次执行
方法区(元空间)常量+静态变量+类信息
运行时内存分配
math对象
一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢 10倍以上。
main 主线程
指发生新生代的的垃圾收集动作Minor GC非常频繁,回收速度一般也比较快。
类加载器classLoader
0 条评论
下一页