java 虚拟机【一个demo 学习--jvm 运行时数据区(五)】
程序其实就是 数据 指令 控制
一 程序计数器 当前线程正在执行字节码指令的地址(行号)
二
虚拟机栈 每一个方法是一个帧栈,存储当前线程运行方法时 用到的 数据 指令 和返回地址
方法中 有变量 --》 有存储变量的 局部变量表(this 变量 对象引用)
方法中 有计算 比如 两个变量求和、 计算的时候 需要地方存储 -->操作数栈
动态链接 一个接口 Service 有两个实现类 ServiceA ServiceB 当,service.do() ,调用方法的时候 service 调用方法的时候,需要service 动态链接去获取一个实例, 为何存到 service.do() 调用的时候才会别解析,
方法出口 就是返回地址
三
方法区 类信息 常量 静态变量 JIT
中间字节码可以确定大小
线程值执行单元 线程执行方法 需要 数据 指令 返回地址 存储一个地方
javap -v xxx.class 可以获取反编译文件
举例: int j=0;
首先 将0 压栈, 就是将 0 存到 操作数栈中, 然后将 0 出栈,赋值到 局部变量表 j 中
xss 栈的深度 栈是有限的 超过会报错 StackOverFlowError
jvm 内存模型 JMM
复制回收算法, 一个对象 new 8M() ,放入到 eden 区,后来 又来了 一个 new 1M 这时候,eden 已经存不下, 8M 就到老年代
meta Space 是可以动态扩容的