JVM 运行原理
2020-10-16 10:01:08 1 举报
jvm运行
作者其他创作
大纲/内容
加载初始化
方法出口
将分配的内存初始化为零值
B
对象引用(引向E)
元空间/方法区
变量压栈
Minor GC
动态链接
Car Class(类信息)
逃逸分析:就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中。-XX:+DoEscapeAnalysis//使用-XX:-DoEscapeAnalysis//不用使用逃逸分析,编译器可以对代码做如下优化:一、同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。二、将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。(栈上分配--Hotspot并没有实现真正意义上的栈上分配,实际上是标量替换)三、分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。在动态编译同步块的时候,JIT编译器可以借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其他线程。如果同步块所使用的锁对象通过这种分析被证实只能够被一个线程访问,就是优化成锁消除。https://blog.csdn.net/w372426096/article/details/80938788
iload_1
Young
实例化
32位长度(4b)
标记-清除算法\t\t\t减少回收停顿时间\t\t\t碎片 -XX:CMSInitiationgOccupancyFraction \t\t\tConcurrent Mode Failure 启用Serial Old
操作数栈
JVM Heap (-Xms -Xmx)
标记整理
getClassLoader()
S0From Space
Serial
F 如Car.java
iload_0
本地方法栈(C)
JVM运行时数据区
young都是复制回收
1.8之前叫永久带
methodB
1,句柄java堆中划分出一块内存作为句柄池,reference中存储的是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。句柄访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动时,只用修改句柄中的实例数据指针,而reference本身不需要修改!
-优先分配Eden区•大对象直接分配到老年代-XX:PretenureSizeThreshold• 长期存活的对象分配老年代-XX:MaxTenuringThreshold=15• 空间分配担保-XX:+HandlePromotionFailure检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。• 动态对象年龄对象如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代-XX:TargetSurvivorRatio
执行引擎execution engine
Virtual-伸缩区
垃圾回收
老年代
局部变量表
调用
methodA
本地方法接口
默认
对象引用:就是通过栈帧中局部变量表所存储的对象引用来对堆内存中的对象实例进行访问或操作的!简单点理解就是栈帧中有个对象引用的指针,通过各种方法指向了堆内存中的对象实例。
若未找到引用,则执行类的加载,加载,验证,初始化
car1
来回换
Old
Car实例
使用4
Eden(伊甸园)
Major GC
getClass
新生代Young
程序计数器(A)
CMS
调用对象的 init 方法
存活区-Survivor
ParallelScavenge
卸载5
class文件
S1To Space
JVM
解析2.3
对象的访问
new 类名()
Parallel Old
类加载的生命周期
加载1
对齐填充Padding(保证对象是8个字节的整数倍)
G1
压栈
准备2.2
Young Gen (-Xmn)
连接2
实例数据Instance data
虚拟机栈(B)
类加载器子系统classload(F)
ClassLoader
虚拟机为对象分配内存E
E 堆内存模型
方法区(D)
1.线程是用来执行方法的,至于怎么执行,取决于虚拟机栈。2.我们定义的常量和静态变量是存在方法区的,就是用于线程之间共享的。
2,直接访问对象reference直接指向了对象类型数据,那么java堆对象分布中就必须考虑如何放置访问类型数据的相关信息,reference存储的直接就是对象地址。好处就是,减少一次指针定位的时间开销
Serial Old(MSC)
Class.class
基本类型
1,指针碰撞:依靠连续的内存空间,靠指针的移动来分配内存。2,空间列表:由固定的列表记录内存分配的信息,每一线程指定一块空间。TLAB
Old区
Object
本地方法库,c/c++
元空间
操作压栈
根据new的参数在常量池D中定位一符号引用
标记-整理算法
堆(E)
car2
-XX:MaxPermSize
验证2.1
parNew
Parallel
初始化3
一个方法一个栈帧
方法区是一种定义,概念。而所谓永久带或元空间是其一种实现机制
0 条评论
回复 删除
下一页