jvm 启动流程


启动类

java xxx ---> 装载配置 --->  根据配置找到jvm.dll -->初始化JVM获得JNIEnv接口-->找到main方法

                  ( 根据当前路        jvm.dll 是jvm                    JNIEnv为 jvm 接口

                     径和系统版           主要实现                        findClass等操作通过它

                    本寻找jvm.cfg                                          实现

                     )

jvm基本结构

JVM 运行机制

执行引擎执行字节码

pc寄存器

每个线程拥有过一个pc寄存器

在线程创建时创建

指向下一条指令地址

执行本地方法的时候,pc的值为undefined


方法区(用来描述一个类)

保存了状态类的信息                     jdk6时, string等常量信息 至于方法

    类型常量池                              jdk7  已经移动到了堆栈

    字段,方法信息

     方法字节码           

通常和永久区关联在一起    

java堆

和程序开发密切相关,

应用系统的对象保存在堆中 

所有线程共享java堆

对于分代gc来水,堆也是分代的

java栈

线程私有

栈是由一系列帧组成(java 栈也叫帧栈) 先进后出

帧保存一个方法的局部变量、操作数栈、常量池指针

每一次方法调用创建一个帧,并压栈。


java栈中 局部变量表

JVM 运行机制

静态的函数  表 中很多槽位,最大容纳32位的数据类型  long由64位 2个槽位 对象传的指针

普通函数 。第一个数this指针


每次函数调用都会产生一个帧,递归调用时候不断的往上压

JVM 运行机制

局部变量表,与操作数栈

JVM 运行机制


c++ 在栈上分配内存,不需要释放 ,借鉴到java上

JVM 运行机制



JVM 运行机制


java 栈上分配

小对象(几个是byte) 在没有逃逸的情况下,可以分配到栈上

直接分配到栈上, 可以自动回收,较少gc压力

大对象和逃逸对象无法在栈上分配

逃逸情况指的是 多个线程共有的对象要在堆上分配


栈 、 队、方法区的交互情况

JVM 运行机制


内存模型

每个线程都有自己的工作内存和主存

主存就是大家共享的内存空间,考虑效率问题,每个线程都有自己的工作区间

当数据从主存复制到工作存储时候,1 read 2 load

JVM 运行机制


JVM 运行机制

 注意volatile 使用

JVM 运行机制

如果不使用volatile 程序会一直的跑着


线程的可见性

JVM 运行机制

线程的有序性和指令重拍,有些可以重拍有些不可以

JVM 运行机制


JVM 运行机制


JVM 运行机制

字节码两种执行方式

JVM 运行机制


                            


相关文章:

猜你喜欢
相关资源
相似解决方案