JVM整体结构及内存模型详解
2022-01-19 17:24:11 0 举报
JVM整体结构及内存模型详解
作者其他创作
大纲/内容
老年代剩余可用空间<年轻代里现有的所有所有对象
逃逸分析:-XX:+DoEscapeAnalysis标量替换:-XX:+EliminateAllocations如果开启了以上两个参数,会通过逃逸分析确定对象不会被外部访问,并且对象是聚合量,会对其进行标量替换,在栈帧或寄存器上分配空间
b=2
1
静态变量的值如果为对象,则该处存储的是堆中该对象的地址
字节码执行引擎
程序员访问Math类元信息的入口(反射等)
Survivor区
Java虚拟机
将要计算的值从操作数栈出栈到CPU中进行计算后赋值给变量
类装载子系统
局部变量表
方法出口
是
元空间在直接内存中
对象
设置堆最小内存:‐Xms设置堆最大内存:‐Xmx设置Eden区大小:-Xmn设置栈内存大小:‐Xss 元空间触发Fullgc的初始阈值:-XX:MetaspaceSize:设置元空间最大值, 默认是-1(不限制):-XX:MaxMetaspaceSize:例子:java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar app‐server.jar
本地方法栈
minor gc
否
程序计数器
记录该方法执行完后将执行代码的位置
年轻代(1/3)
user
在运行时将符号引用替换为直接引用对应的内存地址
1、大对象直接进入老年代2、长期存活对象:当一个对象经过15(cms默认6次)次minor gc后仍然存活,就会被晋升到老年代3、对象动态年龄判断(minor gc之后触发):一批对象的总大小大于这块Survivor区域内存大小的50%,那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了
静态变量user
-XX:-HandlePromotionFailure参数是否设置
computer()-栈帧
CPU寄存器
java.lang.Class对象
this
full gc
full GC (STW:保证GC开始时GCRoot不会变动,简化GC算法)
1、自行a=1时先将1在这里入栈、出栈
堆
动态链接
老年代剩余可用空间<之前每次minor gc后进入老年代的对象的平均大小
操作数栈
eden(8/10)
c=10
a=1
main()-栈帧
1、大对象大小:-XX:PretenureSizeThreshold ( Serial 和ParNew下才有效)2、晋升老年代的年龄阈值:-XX:MaxTenuringThreshold3、对象动态年龄判断:-XX:TargetSurvivorRatio
full gc后还是没有足够空间存放新的对象就会发生\"OOM\"
Math.class
程序计数器:由字节码引擎边执行程序边修改,每执行一步都会改变,用于记录程序执行到了哪一步
内存大小参数设置
FIFO 栈(线程)
math
对象头的Klass Pointer指针通过该指针确定对象是哪个类的实例
修改
老年代(2/3)
参数
s1(1/10)
java Math.class
java与底层c++交互的接口
s0(1/10)
年轻代minor gc之前
2、然后将1出栈,赋值给变量a
方法区(元空间)常量+静态变量+类元信息
执行
老年代空间分配担保机制:
computer方法字节码:
main线程
栈(线程)
收藏
0 条评论
下一页