不要觉得标题奇怪,这是根据前几次的标题规律定的
串行垃圾回收器
分为两类serial和serial old,
1.serial作用于新生代,采用复制算法清理垃圾
2.serial old 作用于老年代,采用标记-整理算法
特点:清理垃圾时只有一个线程工作,会出现STW现象
并行垃圾回收器
分为parallel New和parallel old,这是JDK8默认的垃圾回收器
1.parallel NEW用于新生代,采用复制算法
2.parallel old 用于老年代,采用标记-清理算法
特点:垃圾回收时,多线程工作,也会出现STW现象
CMS(并发)垃圾回收器
这是一个并发的垃圾回收器,采用标记-整理算法清理垃圾,作用与老年代的垃圾回收,主要目标是以最短回收停顿时间,
特点是:垃圾回收时应用依然可以正常运行
G1(gabage first)垃圾会收器
这是一个比较复杂的垃圾回收器
这是有用于新生代和老年代的垃圾回收器,是JDK9之后默认垃圾回收器
内存被划分为多个同等大小的区域,不再有固定的eden区、survivor区,old区,humongous区每个区域都可以充当这些区域,来存放对象
垃圾回收时采用复制算法,优点是:响应时间与吞吐量兼容性好
有三个阶段的垃圾回收阶段:
新生代回收:没什么特殊点,就是使用复制算法清理新生代区域(eeden区和survivor区),清理过程会存在stw线程
并发标记:当老年代使用空间超过整理内存的(45%)时会触发并发标记
混合回收:特点是会根据清理垃圾时的暂停时间长短来判断哪些垃圾的回收价值高, 那么他就会优先回收哪些区域,本次回收会针对eden区、survivor区、老年代区
那么对于一些较大的对象会存放到humongous区,也有可能会分配连续的区域来存放
再多讲一个可能会出现的面试题:
强引用:直接与GC root引用,一直都不会被回收
软引用:关键词:softreference ,垃圾回收后,内存不足时会被回收
弱引用:垃圾回收时,必然会被回收掉
虚引用:必须配合引用对象使用,被引用对象回收之后虚引用相关内存会被直接释放