《深入理解java虚拟机》读书笔记(2)- JVM垃圾回收与内存分配

《深入理解java虚拟机》读书笔记(2)- JVM垃圾回收与内存分配

前言

面向的读者:

  • 有一定java基础
  • 想系统学习JVM基础知识

文章目的:

  • 自己读书笔记
  • 精炼知识点,实现输入输出闭环

一、对象能被回收的条件是什么

一个对象是否能被回收,需要做出精确的判断。这个是对象回收的必要条件。JVM有自己的一套体系来产生这个条件。简单来说,对象如果肯定不被使用,那就可以回收

1. 引用计数算法(JVM没有采用此方法)

就是在对象上增加一个计数器,当被引用过一次,计数器就加1。当回收发生时,那些引用次数为0的对象就是可以回收的。
显然,这样的算法有很多问题,比如循环引用。对象A,B互相引用,他们的计数器就永远不可能为0,导致无法回收对象

2. 可达性分析

JVM 采用的是图论中的不可达来进行对象标记的。
GC
从图中可以看出,对象5,6,7 是不可达的,这样,他们可以被回收(但具体是否要回收,需要由垃圾回收器来执行)
这里还需要知道一个问题,就是GC Roots, 因为JVM 垃圾回收器,会从GCRoots 开始,但是那些对象可以作为GC Root。

  • stack 中引用对象
  • metaspace 中的静态属性引用
  • 常量池中的引用对象
  • 本地方法栈中的引用对象
  • JVM内部引用,e.g… Class对象,类加载器
  • 被同步锁持有的对象
  • 其他增加的GCRoot

有了GCRoots 还需要考虑一个问题就是 GCRoot 的膨胀,这个问题在后续具体的回收器实现上再做讨论。

3. java 中的引用

首先引用(reference) 在物理上来看,是没有任何区别的,就是内存中存了某一个对象的地址。但是在逻辑上,JVM划分了不同的引用类型,以便垃圾回收

  • 强引用(Strongly Reference): Object objec = new Object2()
  • 软引用(Soft Reference): 还有用,但并非必要的对象。(举个例子?),只要没有发送内存溢出前,这些对象不会被回收
  • 弱引用(week reference):也是非必要对象,只不过活不过一轮GC,当GC发生时,就会讲他回收掉
  • 虚引用(Phantom reference): (这个目前还想不到合适的例子)

二、垃圾收集算法

1.分代垃圾回收(垃圾回收算法的基础)

这里有两个基本假说(并且这个假说在绝大多数情况下是成立的)

  • 弱分代假说(weak Generational Hypothesis): 绝大多数对象是朝生夕灭的。
  • 强分代假说(Strong Generational Hypothesis): 熬过越多次垃圾收集过程的对象就越难以消亡。
  • 跨代引用假说(Intergenerational Reference Hypothesis):

这两个假说,是垃圾收集器的基础。所有垃圾收集器(分代)。都是基于这两个假说进行设计的。可以说,通过这两个假说,将对象分为不同的区域,这样可以提高收集的效率,于是有了 Minion GC(针对新生代的GC), Major GC(针对老年代的GC), Full GC(针对所有区域的GC)。

2. 标记-清除算法(mark-Sweep)

mark-sweep
这个方法简单直接,但是也会带来两个问题:

  • 效率不稳定,从图中看出,如果需要回收和标记的对象太多,将使GC不稳定
  • 碎片问题,内存里会出现大量碎片

3. 标记-复制(现代JVM GC 使用最多)

mark-copy
mark-copy 优化:
基于前面的弱分代假说,大多数对象都是朝生夕灭的。针对这个特征,对mark-copy做优化
分代回收

4. 标记-整理(mark-compact)

和mark-sweep 一样,只不过mark-compact 会在删除回收后的对象后,会对内存做一次整理,让内存重新排列。这个算法有个最大问题是需要移动存活对象,这将导致系统不可用(stop the world)。但可用增加吞吐量

三、算法实现细节

由于目前先对理论有个大概了解,这一章节的后半部分,先列出提纲,之后再完善补充

1. 根节点枚举

2. 安全点

3. 安全区域

4. 记忆集与卡表

5. 写屏障

6. 并发的可达性分析

四、经典垃圾收集器

同上,此次文章注重理论总结,具体的垃圾回收器以及他们的特点,可用列一个表格来总结(表格稍后再列,或者可参考书)。

总结

本章主要讲解垃圾回收的算法和过程。由三个假说,推断出分代回收,进而对分代回收做优化。目前市面上的回收器,都是基于这三个假说和三个垃圾回收算法实现的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值