Mark Sweep algorithm 首先需要 #STW 从 #gcroot 出发遍历所有对象,将不可达的对象标记上 然后将标记过的对象全都进行回收 #mark-sweep 法作为最最基础的算法是非常符合直觉的,也非常容易实现.但非常明显的一个问题就是,容易造成内存碎片化,到最后明明内存有的是,但由于每个内存之间不连续,无法一次性分配出足量的连续内存,导致系统崩溃 2021-09-26 development #jvm #gc
Object Generational Assumption 根据统计显示,绝大部分创建出来的对象都符合如下图般的规律. 大部分对象的存活时间都非常短,刚创建出来一会儿就不再有引用了.例如在做计算的过程中所创建出来的对象,在一个计算公式结束后计算过程中所有的中间临时变量都不再有用了. 而另外,有一小半对象的存活时间会非常长,甚至是一直存在于进程之中的.例如系统配置变量等需要全局引用的对象等. 剩下的那些存活时间不长也不短的对象,则仅仅占据了非常小的比例. 2021-09-26 development #java #jvm #gc
Object Liveness 为了确定一个对象是否可以进行内存回收,我们有以下几种判定方法 引用计数法引用计数法是非常经典也非常简单容易实现的判定方法.基本原理就是每当有一个引用挂在对象上,这个对象上的引用计数器就+1.若对象上的引用计数器归0了则判定这个对象可以被回收.这个算法非常好理解,也非常好实现,很多语言例如Python都是用这种方式. 但这个方法有一个严重的问题,就是如果两个对象互相引用对方,而没有其他引用指向这两个 2021-09-26 development #java #jvm #gc
Parallel New algorithm 本收集器是一种新型的 #并行 的针对 #新生代 的 #分代收集器 . 和[[Parallel Scavenge]]类似,但性能更好一点, 并且可以和[[CMS]]协同使用.收集过程中需要 #STW 1java -XX:+UseParNewGC -jar Main.java 使用的是多线程 #并行 #mark-copy 算法.对老生代来说,可以使用[[CMS]]收集器. 2021-09-26 development #jvm #gc
Parallel Old algorithm 本收集器是针对 #老生代 的 #并行 #分代收集器.在收集的过程中,会启动多个线程进行并行收集,每个线程都会使用 #mark-compact 由于本收集器只针对老生代,新生代会使用[[Parallel Scavenge]] 1java -XX:+UseParallelGC -jar Main.java 一旦启用了UseParallelGC参数,两种收集器就会同时使用起来. 2021-09-26 development #jvm #gc
Parallel Scavenge algorithm #scavenge 本收集器主要是针对 #新生代 的 #分代收集器,运行的算法主要是 #mark-copy ,只不过是由多个线程 #并行 (parallel)的进行垃圾收集,而每个线程所执行的算法也只是简简单单的 [[Serial]],因此该过程需要 #STW .由于本身使用了多线程进行并行处理,整个垃圾清除过程会比[[Serial]]快一些.当然也由于并行的存在,使得线程调度和实现过程变得略微 2021-09-26 development #jvm #gc
Serial algorithm #分代收集器 使用单线程 #串行 地进行垃圾清理.尽管新生代和老生代的垃圾处理逻辑有一些不同(由于新生代有 #eden 和 #survivor 的分隔),但总体逻辑没有什么差别. 对于 #新生代 来说,本收集器的做法是 #STW 并使用 #mark-copy 对于 #老生代 来说,会使用 #STW 并进行 #mark-compact ,一般这个收集器称为 #serial-old 本收集器的性能 2021-09-26 development #jvm #gc
Shenandoah algorithm #分区收集器#并行 source code 处理流程 初始标记 做下一阶段的准备活动 扫描 #gcroot 并 #STW #并发 标记 检查整个堆以分析对象可达性 最终标记 完结并发标记阶段,等待所有更新队列中未完成的标记任务结束,然后重新扫描一遍 #gcroot 根据扫描所得的结果集启动copy流程,对某些 #gcroot 进行初步复制,并准备进入下一阶段 触发 #STW #并发 清理 2021-09-26 development #jvm #gc
Why GC GC还未出现的时代在自动垃圾回收概念出来之前的那个时代,大部分程序都是用诸如C语言这样的程序语言来编写的,而在C或者CPP语言中,所有的内存分配和回收都必须要开发人员手动处理,以C为例: 申请空间123456789101112131415#include <stdlib.h>#include <string.h>typedef struct { int id; 2021-09-26 development #java #jvm #gc
ZGC algorithm ZGC是一个由Azul System公司研发的商用 #分区收集器, 可以使用在 #NUMA 架构上#STW 时间基本稳定,和堆大小无关适合TB级别堆 source code 处理流程 标记启动 超短 #STW 标记 #gcroot 指向的对象 #并发 标记 与G1相同,遍历对象做可达性分析 ZGC的标记实在指针上而不再对象上,将指针更新Marked 0, Marked 1标志位 标记结束 超短 2021-09-26 development #jvm #gc