java中GC机制
上一讲说到java堆中是垃圾回收的主要管理区域,本讲来具体讲解JVM的垃圾回收机制(以下部分内容来自深入理解JVM)
# 对象的结构与对象的内存分配方式
1、对象的内存结构
a、对象头(Header)
- 自身运行时数据(Mark Word)
哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等 - 类型指针
- 指向对象类型的指针,就是方法区中存储的哪个类
b、实例数据(Instance Data)
4. 基本数据类型(Longs doubles shorts…)
5. 引用数据类型
c、填充(Padding)
6. 计算机存储使对象的内存为8字节的整数倍,不够就填充
2、对象的内存分配方法
指针碰撞:针对于垃圾回收规整区域
原来空闲区域为实线左边,创建一个对象,分界线就移到了虚线那一块,实线与虚线为边界的区域就是对象的内存区域
空闲列表:不规整
通过列表来记录那些区域空闲,把对象放到空闲列表中空闲的地址区域,这里就存在一个问题就是多线程的话需要保证线程同步,否则当一个对象分配区域0X02,另一个线程创建对象也同时分配0X02,空闲列表还未更新,对象就被线程2修改。
谈谈ThreadLocal和Synchronized
ThreadLocal:通过创建对象本地副本,使得每个线程都是对不同的内存区域进行操作,使得线程可以并发同步进行,简单来说内存消耗增加,时间减小
synchronized:对变量加锁,使得每次都只有一个线程区访问,线程之间只能串行对变量进行操作,这里具体锁机制也会在后面提到
2、对象的访问方式
- 使用句柄
句柄含两个指针:堆中对象+方法区中对象类型
来自:https://blog.youkuaiyun.com/qq_16438883/article/details/103086386
2. 使用指针(没啥可讲)
## JVM的垃圾回收机制
1、回收什么
回收堆中没有引用指向的对象
2、怎么判断对象没有引用指向
- 引用计数法
当有引用指向对象,计数器就+1,引用失效就-1,在任何时刻计数器都为0就需要回收
局限:
当对象循环调用时候。
当a,b失效时,m1与m2也应该被回收
public class GCTest01 {
public Object instance=null;
private static int MB = 1024 * 1024;
private byte[] bigSize = new byte[2 * MB];
public static void main(String[] args) {
GCTest01 a = new GCTest01();
GCTest01 b = new GCTest01();
a.instance = b;
b.instance = a;
a=null;
b=null;
System.gc();
}
}
这里好像是用的G1收集器,最后用了Full gc,一个young region是1024k,0survivors,最后没有存活的对象:(这里还不太明白,欢迎大佬指正)
- 可达性分析
通过GC Roots集合中根对象区寻找对象,m3就找不到,就回收
GC Roots包含那些就是重点了:
1、虚拟机栈(栈帧中的局部变量表)中引用的对象(就是存储方法中的基本数据类型和引用对象)
2、方法区的类属性引用对象
3、方法区中常量引用的对象
4、本地方法栈中应用的对象
垃圾回收算法
分代收集理论
新生代:大批对象死去
老年代:回收存活的少量对象就放里面了
垃圾收集算法
对同一个区域中可回收的打上标记进行分类在回收
标记-复制:原来的内存对半分,然后存活的对象复制到另一块区域,一次清理一块区域
直接每次把上面的区域全清了
标志-整理算法:在上面的基础上,不分区域,让存活的对象向一端移动,清理掉存活对象边界以外的
(老年代存活对象多就移动的代价就大如果能操作失活的对象就小,个人玩笑)
## 垃圾收集器
介绍下cms和g1
CMS:基于标记-清除算法
- 初始标记
- 并发标记
- 重新标记
- 并发清除
大约就是先小标记-遍历整个对象图-修正线程运行导致的对象标记变化-清除
并发和用户线程一起,你在做事,他在监督,不过你是主导(修正阶段就体现)
G1:基于Region的堆内存布局
把真个堆内存划分成了一堆小的region
https://blog.youkuaiyun.com/weixin_43934607/article/details/109287602
这个讲的很清楚
Eden:新创建的对象放里面(一系列region的集合)
survivor:回收过后的存活对象放里面({regions})
然后有点类似于机器学习中的集成学习
计算回收
收益函数:region回收后内存能大多少以及回收时间
就维护一个region优先级列表:先收集那块区域
差不多了,写作不易,给自己点歌赞