JVM学习总结
2020-08-25 10:24:45 0 举报
JVM知识整理
作者其他创作
大纲/内容
reference
SerialOLD
内存空间回收情况和简单配置
内存共享区
灰色: 表示对象已经被垃圾收集器访问过, 但这个对象上至少存在一个引用还没有被扫描过
年轻代
原始快照就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)
黑色: 表示对象已经被垃圾收集器访问过
FullGC
标记清除
漏标的处理方案: 增量更新(Incremental span style=\"font-size: inherit;\
对象创建过程
直接访问对象
G1:写屏障 + 原始快照
ZGC
白色: 表示对象尚未被垃圾收集器访问过。在可达性分析刚刚开始的阶段, 所有的对象都是白色的, 若在分析结束的阶段, 仍然是白色的对象, 即代表不可达
CMS:写屏障 + 增量更新
对象类型数据指针
退化
多标的处理方案:针对并发标记(还有并发清理)开始后产生的新对象,通常的做法是直接全部当成黑色
new 类名()
分配内存的方式
方法区配置-XX:MetaspaceSize -XX:MaxMetaspaceSize
方法区
局部变量表
空闲列表
动态链接
对象类型数据
标记整理
保证整个对象的大小为8字节的整数倍方便数据读取
操作数栈
方法出口
垃圾回收算法
CMS
如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离
年轻代大小设置-Xmn
对象实例
堆
栈帧MethodA
如果Java堆中的内存并不是规整的,已使用的内存和空 闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记 录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录
幸存者区S1
本地方法栈
三色标记
Parallel Scavenge
本地方法库
栈帧
对象头ObjectHead(32位)
ParNew/Parallel Scavenge并行收集器
Old老年代
ParNew
句柄方式访问对象
分代收集理论
调用对象init方法初始化
方法区/元空间
句柄池
CMS并发收集器
线程栈
一个方法一个栈帧
并发垃圾回收器
youngGC
栈帧MethodB
类加载子系统
找到相关类系信息
未找到相关类信息
Object对象结构
java栈本地变量表
Serial
JVM运行时数据区
MethodB
Serial/SerialOLD串行收集器
MethodA
实例数据
老年代
本地方法接口
执行引擎
G1垃圾回收器
程序计数器
压栈
Parallel OLD
数据体
指针碰撞
幸存者区S0
根据new的信息去方法区查找是否已经加载过相关类
A调用B
对象头ObjectHead(64位)
设置对象头
对方访问方式
对齐填充
垃圾回收器
eden
处理方式:三色标记
对象实例数据指针
虚拟机栈/线程栈
虚拟机为对象分配内存
标记复制
G1
ZGC:读屏障
增量更新就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。 这可以简化理解为, 黑色对象一旦新插入了指向白色对象的引用之后, 它就变回灰色对象了
内存独享区
0 条评论
下一页