写点什么

《架构师训练营》第 9 周 命题作业

用户头像
关注
发布于: 2020 年 08 月 05 日

Java 垃圾回收原理

Java 虚拟机进程在启动时,除了工作线程外还会额外启动垃圾回收线程,对堆空间内不再使用的内存空间进行回收清理。

Java 在进行垃圾回收时,考虑以下几个问题:

1、怎么知道哪个对象需要回收

Java 使用可达性分析算法,从栈帧中的局部变量和方法区的静态变量出发,递归标记所有被引用到的对象。剩下的未被标记的对象就是需要回收的垃圾对象。

2、如何回收对象

  • 清理,标记垃圾对象的内存为已空白内存。

  • 压缩,将有引用的对象拷贝到同一内存空间的一块区域

  • 复制,将所有有引用的对象拷贝到另外一块内存空间

3、回收过程中的内存空间是如何管理的

Java 虚拟机的堆空间主要划分为两个区:新生代和老年代。新生代又会被分为 Eden、From Survivor、 To Survivor 区。

在 Java 程序运行中,新的对象总是会在 Eden 区创建,如过 Eden 区满了,会触发垃圾回收机制,将有引用的对象拷贝你到 From 区;Eden 区继续为创建新的对象使用,如果 Eden 区再次满了,会将 Eden 区有引用的对象和 From 区有引用的对象拷贝到 To 区;如果 Eden 区再次满了,会将有引用的对象一起拷贝到 From 区。

就这样直到整个新生代区满了,GC 会将新生代有引用的对象拷贝到老年代。

4、用什么样的过程进行回收

在进行垃圾回收时,如果需要停止所有的应用线程,这种状态被成为 stop-the-wold

串行回收器

触发 GC 时,将所有的应用线程全部停下来,程序进入 stop-the-wold 状态,同时启动一个线程执行垃圾回收。在早期的单核 cpu 架构下,一个线程足够充分利用系统资源,因此串行回收器是可以的,但是如果是在多核 cpu 架构下就无法充分利用 cpu 性能。

并行回收器

触发 GC 时,将所有的应用线程全部停下来,程序进入 stop-the-wold 状态,同时启动多个垃圾回收线程执行垃圾回收。

并发垃圾回收器(CMS)

并发垃圾回收器分为 4 个阶段:

  • 初始化标记

  • 并发标记

  • 重标记,重标记会进入 stop-the-wold 状态。

  • 并发清理

并发垃圾回收器的优势在于会能够最小的影响应用线程的执行,重标记时虽然进入了 stop-the-wold 状态,但是时间比较短,对应用线程影响比较小。

并发垃圾回收器的劣势在于它过程复杂,会比较消耗系统性能。

G1 垃圾回收器

G1 垃圾回收器使用了分治的思想,将堆空间划分为 2000 个小的区域。再将每个小的区域划分为 Eden、From、To、Old 区,针对每个小区域进行垃圾回收处理。


用户头像

关注

还未添加个人签名 2018.06.14 加入

还未添加个人简介

评论

发布
暂无评论
《架构师训练营》第9周 命题作业