写点什么

第九周作业

用户头像
Meow
关注
发布于: 2020 年 11 月 22 日

作业一:

(至少完成一个)

  • 请简述 JVM 垃圾回收原理。


JVM 的垃圾回收目的是为了将 JVM 堆中已经不再被使用的对象清理掉以释放内存。


通过可达性算法进行标识

通过标记来识别哪些对象需要被回收,标记的方法如下:

  • 从线程栈帧中的局部变量或方法区中的静态变量开始出发,将引用了这些变量的对象进行标记

  • 再看这些被标记的对象有没有被引用,如果有继续标记

  • 这样最终没有被标记的对象,就是需要被回收的对象


回收的方法有三种,清理,压缩和复制。

  • 清理:将垃圾对象占用的内存空间标记为空闲,并记录在一个空闲列表中,有内存申请需要时,才会把这些空间分配出去。

  • 压缩:从堆内存的头部开始,将存活的对象拷贝到一段连续的内存中,那么剩下的空间就是可用的了,并且是连续的。

  • 复制:将堆空间分为两部分,只在其中一部分中创建的对象,当这部分空间用完时,将标记的对象复制到另一个空间中,这样这个空间的内存就是可用的了。


分代回收

将堆内存分为新生代和老年代,新生代又分为 Eden 区,From 区,To 区。

  • 在 Eden 区中申请空间创建对象

  • Eden 满了以后,遍历 Eden 区判断哪些对象可回收,启动 young GC

  • 将标记的对象拷贝到 from 区,Eden 区变空

  • 一段时间后 Eden 区满,将 Eden 区和 From 区的标记对象拷贝到 To 区,From 区和 Eden 区变空

  • 再一段时间后 Eden 区满,将 Eden 去和 To 区的标记对象拷贝到 From 区,To 区和 Eden 去变空

  • 多次拷贝后仍被标记的对象,就会被拷贝到老年代


垃圾回收器的算法

  • 串行回收器:单独启动一个线程专门用于垃圾回收,当 GC 时所有线程都停止工作『stop the world』,等待这个线程的 GC 完成

  • 并行回收器:并行是指可以启动多个线程进行垃圾回收;当 GC 发生时,仍然会『stop the world』,但可以根据 cpu 核心数,启动多个线程进行 GC,效率更高。

  • 并发垃圾标记清理(CMS):并发是指 GC 线程和业务线程可以同时工作,同时也就意味着可能会出现重标记,重标记期间还是会发生『stop the world』,比并行回收器,对业务线程影响较小,但更好资源。

  • G1 回收器:jdk1.7 高版本开始引入 G1,是目前比较高效的算法


用户头像

Meow

关注

还未添加个人签名 2018.05.09 加入

还未添加个人简介

评论

发布
暂无评论
第九周作业