JVM的运行原理
2022-05-04 16:41:55 1 举报
初略的介绍jvm的大体流程
作者其他创作
大纲/内容
Car实例
存活区-Survivor
methodA
car2
实例化
对象引用(引向E)
1、线程是用来执行方法的,至于怎么执行,取决于虚拟机栈2、我们定义的常量和静态变量是存在方法区的,就是用于线程之间共享的
Old区
调用
执行引擎execution engine
将分配的内存初始化为零值
本地方法库,C/C++
-XX:MaxPermSize
操作数栈
局部变量表
Young Gen(-Xmn)
虚拟机为对象分配内存E
Virtual-伸缩区
一个方法,一个线程栈
car1
方法区(D)
操作压栈
getClass
老年代
JVM Heap(-Xms -Xmx)
JVM运行时数据区
逃逸分析:就是分析对象到动态作用域;当一个对象在方法中被定义后,他可能被外部方法所引用,例如作为调用参数传递到其它地方中。-XX:+/-DoEscapeAnalysis使用逃逸分析,编译器可以对代码做如下优化:一、同步省略:如果一个对象呗发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。二、将堆分配转化为栈分配,如果一个对象在子程序中被分配,要是指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配(栈上分配-HotSpot并没有实现真正意义上的栈上分配。实际上是标量替换)。三、分离对象或标量替换,有的对象可能不许哟啊作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。在动态编译同步块的时候,JIT编译器可以借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其它线程,如果同步块所使用的锁对象通过该这种分析被证实只能够被一个线程访问,就是优化成锁消除
元空间
虚拟机栈(B)
基本类型
方法出口
新生代Young
F 如Car.java
iload_0
Car Class(类信息)
元空间/方法区
动态链接
本地方法接口
class文件
E 堆内存模型
32位长度(4K)
new 类名()
根据new的参数在常量池D中定位定位-符号引用
S1ToSpace
调用对象的init方法
1.8之前叫永久代
压栈
加载初始化
程序计数器(A)
getClassLoader()
methodB
1、程序计数器2、虚拟机栈3、本地方法栈4、方法去5、堆
变量压栈
ClassLoader
iload_1
本地方法栈(C)
B
S0FromSpace
Class.class
Eden(伊甸园)
Minor GC
1、指针碰撞:依靠连续的内存空间、靠指针的移动来分配内存2、空间列表:由固定的列表记录内存分配的信息,每一线程直到一块空间,TLAB
堆(E)
类加载器子系统classLoad(F)
若未找到引用,则执行类的加载、加载、验证、初始化
Major GC
0 条评论
下一页