java 栈帧 每个方法都有自己的栈帧
局部变量表(数组位置0为当前对象this,方法中的常量值,对象在堆中的内存地址),操作数栈(暂存赋值操作数的内存空间),动态链接(符号引用转为直接引用,方法区方法的入口位置),方法出口(当前方法返回到main方法的位置,main继续执行)
a = 1;
先将1压入操作数栈,局部变量a赋值为1
gcroots: 栈局部变量,
引用到的所有对象 非垃圾对象 复制到S0 younggc
哪些对象会进入老年代:
长期存活的对象:数据库连接池,springbean,缓存对象
大对象直接进入老年代 jvm设置大对象大小参数
对象动态年龄判断:对象大小大于s0区的50%,会直接分配到老年代
对象组成
对象头 示例数据 对齐填充
对象头包含MarkWord 类型指针 数组长度
MarkWord包含哈希值,gc分带年龄,锁状态标记,
为什么必须stw:gcroot进行标记后对象状态不改变,同时执行的话,垃圾对象需要多次遍历是否是垃圾
Java 应用启动 jvm 启动和停止
类加载系统
- 加载阶段
- 验证阶段
- 初始化阶段
加载
App class loader
JVM 运行时数据区
分为以下几部分内存
- 虚拟机栈 栈帧 每个线程都有
- 本地方法栈
- 堆 多线程共享
- 程序计数寄存器 当前线程在执行的指令行号 作用:cpu切换线程执行时需要这个值
- 方法区 运行时常量池,类的方法,类变量,静态类地址指针指向堆空间的对象 metaspace
thread — 方法栈,本地方法栈,程序寄存器
字节码执行引擎
修改程序计数器的值
gc线程
解释器 jit编译器 垃圾回收