JVM流程图
2021-07-23 16:13:17 19 举报
JVM流程图一
作者其他创作
大纲/内容
方法区
Shenandoah
常量池是什么,存储在哪里?符号引用是什么?为什么可以可以从常量池中获取类的符号引用?
判断一个对象是否死亡?
ParallelScavenge
是
如何回收已经死亡的对象?
垃圾回收算法
TLAB方式可提前至TLAB分配
年轻代
指针配碰撞方式分配:使用和空闲分界点一个指针,移动指针分配
new User(...)对象创建
jvm
对象分配内存过程属于非原子操作,并发环境高频率创建对象如果保证线程安全?
对象初始化
S0:1
划分一块内存分配给该对象
在哪里分配?堆;堆是什么?运行时数据区域之一
对象创建在虚拟机中是非常频繁的行 为,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象 A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况=>1、通过指针分配一块指定大小的内存2、将指针指向目标对象
操作系统
class文件
Kotlin
Serial
这个对象是哪个类的实例、如何才能找到 类的元数据信息、对象的哈希码(实际上对象的哈希码会延后到真正调用Object::hashCode()方法时才 计算)、对象的GC分代年龄等信息
java文件
空闲列表:维护列表记录可用内存,从中分配
CMS
Person person = new Preson()
堆
老年代
jdk9废弃
成员变量:堆局部变量:栈
直接指针来访问最大的好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访 问在Java中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本,就本书讨论的主要虚拟 机HotSpot而言,它主要使用第二种方式进行对象访问
class文件结构是什么样子的,里面都有什么?如何查看和解读?
分代收集
如何访问定位到某一个对象?
TLAB分配
垃圾回收算法 & 垃圾回收器
其他语言
ZGC
创建成功一个真正可用的对象
可达性分析算法
垃圾回收器
标记-整理1、移动存货到一边,边界线以外全部清除2、内存规整;需要移动对象,STW,对象越多STW时间越长
执行类加载,双亲委派机制
对象头信息进行设置
Serial Old
在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的
三色标记
否
S1:1
指向
类加载机制
是否可以在常量池中找到类型的符号引用?=>类的全限定名
G1
原理简单,效率搞,但是单纯的引用计数法很难解决循环引用问题
使用句柄来访问的最大好处就是reference中存储的是稳定句柄地 址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference本身不需要被修改
非原子操作
分代收集;分代假说;跨代引用假说;STW停止用户线程
jvm识别的是class文件,和语言无关,并属于java独有
对象的内存布局:对象头(Header)、实例 数据(Instance Data)和对齐填充(Padding)。对象头是重点,存储两类信息:自身的运行时数据(包含数组长度-属性)、类型指针即对象指向它类型元数据的指针
Parallel Old
堆内存是否规整由垃圾收集器有关,采用标记复制和标记整理则有压缩整理能力内存规整
编译:javac
堆内存是否规整?
ParNew
TLAB是否开启(默认开启)
句柄
标记-清除1、标记所有需要清除的对象,统一回收;也可标记存活,清理未标记2、效率不稳定;内存空间碎片化
通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过 程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。
执行<init>(),真正初始化,执行代码块、构造函数
初始化成员变量零值(不同数据类型的默认值),保证不赋值可以使用=>0/NULL/false
直接指针
CAS:比较和交换;不加锁
class文件是如何加载到jvm中的?如果程序员编写的类和jdk重复如何处理?=>双亲委派机制加载完毕之后存储到哪里?=>方法区,运行时数据区域之一
Groovy
引用计数法
其他可以运行在jvm上的语言
标记-复制1、用一半,留一半,清理时复制存活到未用的一半,清空另一半2、内存规整,内存利用率低,STW
Eden:8
0 条评论
回复 删除
下一页