2-JVM组成
2021-04-11 18:49:15 0 举报
JVM
作者其他创作
大纲/内容
方法区(元空间)常量+静态变量+类信息
操作数栈
老年代(堆的2/3)
FIFO 栈(线程)
字节码执行引擎
15
Eden区(8/10)
s0(1/10)
方法出口
this
局部变量表
a=1
方法区设置:1、关于方法区的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N 2、-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。3、-XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 默认是21M,达到该值就会触发 full gc进行类型卸载, 并自适应调整该值大小。 由于调整方法区的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生 了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大, 对于8G物理内存的机器来说,一般我会将这两个值都设置为256M栈设置:4、-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多
s1(2/10)
JVM虚拟机
存放(a+b)=3的值
本地方法栈
类装载子系统
栈帧对应代码
堆
类加载
记录system.out.prilnt(c)的返回地址,以便执行完回到main方法
new 对象
动态连接
栈(线程栈)
main()方法 栈帧
b=2
java Math.class
运行时将符号引用转为直接引用(例方法名,()等转为直接引用)
执行
1、STW:垃圾回收,会导致所有所有的时间暂停。2、堆=1/3的年轻代(Eden+2s) + 2/3的老年代。3、minor gc:当Eden区放不下,放入其中一个s区;Eden区+s区都放慢,触发minor gc;将存货对象放入另一个s区。对象年龄+1,当达到15,存放到老年代。4、full gc:当老年代满了,触发full gc;垃圾回收后还满,发生OOM。5:为什么设置2个S区? : 避免内存碎片化带来的空间与性能损失6:为什么设置STW机制?:根可达算法的GC root 会有多条路径,如果线程一直运行着;如果首先检测的路径是非垃圾,再去检测其他路径时,首先检测的路径可能这是会变成未引用。这样会变得非常复杂。
main 线程
minor gc
compute()栈帧
整个堆的full gc
c=30
程序计数器
JVM运行时数据区
0 条评论
下一页