jvm 启动流程
启动类
java xxx ---> 装载配置 ---> 根据配置找到jvm.dll -->初始化JVM获得JNIEnv接口-->找到main方法
( 根据当前路 jvm.dll 是jvm JNIEnv为 jvm 接口
径和系统版 主要实现 findClass等操作通过它
本寻找jvm.cfg 实现
)
jvm基本结构
执行引擎执行字节码
pc寄存器
每个线程拥有过一个pc寄存器
在线程创建时创建
指向下一条指令地址
执行本地方法的时候,pc的值为undefined
方法区(用来描述一个类)
保存了状态类的信息 jdk6时, string等常量信息 至于方法
类型常量池 jdk7 已经移动到了堆栈
字段,方法信息
方法字节码
通常和永久区关联在一起
java堆
和程序开发密切相关,
应用系统的对象保存在堆中
所有线程共享java堆
对于分代gc来水,堆也是分代的
java栈
线程私有
栈是由一系列帧组成(java 栈也叫帧栈) 先进后出
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈。
java栈中 局部变量表
静态的函数 表 中很多槽位,最大容纳32位的数据类型 long由64位 2个槽位 对象传的指针
普通函数 。第一个数this指针
每次函数调用都会产生一个帧,递归调用时候不断的往上压
局部变量表,与操作数栈
c++ 在栈上分配内存,不需要释放 ,借鉴到java上
java 栈上分配
小对象(几个是byte) 在没有逃逸的情况下,可以分配到栈上
直接分配到栈上, 可以自动回收,较少gc压力
大对象和逃逸对象无法在栈上分配
逃逸情况指的是 多个线程共有的对象要在堆上分配
栈 、 队、方法区的交互情况
内存模型
每个线程都有自己的工作内存和主存
主存就是大家共享的内存空间,考虑效率问题,每个线程都有自己的工作区间
当数据从主存复制到工作存储时候,1 read 2 load
注意volatile 使用
如果不使用volatile 程序会一直的跑着
线程的可见性
线程的有序性和指令重拍,有些可以重拍有些不可以
字节码两种执行方式