3. 垃圾回收

1. 判断对象是否存活

判断对象存活的方式:

  1. 引用计数算法:会发生循环引用问题
  2. 可达性分析

在 Java 中可作为 GC Roots 的对象有:

  1. 方法区中类静态属性引用的对象。
  2. 方法区中常量引用的对象。
  3. 虚拟机栈(本地变量表)中引用的对象。
  4. 本地方法栈 JNI(Native方法)中引用的对象。

在这里插入图片描述
finalize 理论上可以把对象拯救,但是不保证 finalize 一定执行。

2. 引用类型

  1. 强引用 =
  2. 软引用 SoftReference
  3. 弱引用 WeakReference
  4. 虚引用 PhantomReference

3. 垃圾回收基础

垃圾回收类型:

  1. Minor GC
  2. Full GC

在这里插入图片描述
GC 算法:

  1. 复制
  2. 标记-清除
  3. 标记-整理

复制算法:
在这里插入图片描述
优点:

  1. 简单高效,不会出现内存碎片问题。

缺点:

  1. 内存利用率低,只有一半。
  2. 存活对象较多时效率明显会降低。

标记清除:
在这里插入图片描述
优点:

  1. 利用率百分之百

缺点:

  1. 标记和清除的效率都不高(比对复制算法)
  2. 会产生大量的不连续的内存碎片

标记整理:
在这里插入图片描述
优点:

  1. 利用率百分之百
  2. 没有内存碎片

缺点:

  1. 标记和清除的效率都不高
  2. 效率相对标记-清除要低

4. 垃圾回收器

在这里插入图片描述
新生代垃圾回收算法:
在这里插入图片描述
老年代垃圾回收算法:
在这里插入图片描述
垃圾回收器有单线程、多线程回收器。

其中的并行和并发是:

  1. 并行:垃圾收集的多线程的同时进行。
  2. 并发:垃圾收集的多线程和应用的多线程同时进行。

在这里插入图片描述

5. CMS

CMS 同时存在并行收集、并发收集。
在这里插入图片描述
初始标记:暂停用户线程
并发标记:与用户进程同时进行
重新标记:暂停用户进程
并发清除:与用户进程同时进行

CMS 缺点:

  1. CPU 资源敏感:因为并发标记过程会消耗很多 CPU。
  2. 会产生浮动垃圾:在并发清理时用户线程同时会产生垃圾,所以不能在垃圾满了没有内存之后再进行回收,要预留一部分内存,比如 JDK6 在老年代占用达到 92% 就回收。
  3. 会产生内存碎片:因为 CMS 使用标记清除算法。

6. G1

内存布局改变:化整为零。
在这里插入图片描述
G1 特点:

  1. 空间整合,不会产生内存碎片
  2. 可设置参数控制垃圾回收时的停顿时间,尽可能做到

G1 的垃圾回收模式:

  1. Young GC
  2. Mixed GC

Mixed GC 过程:
在这里插入图片描述

7. Stop The World

暂停所有用户线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值