《架构师训练营》第 9 周 命题作业
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 区,针对每个小区域进行垃圾回收处理。
评论