网站转化,wordpress 批量创建目录结构,wordpress 缩略图判断,企业查询文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器#xff08;Garbage First垃圾优先#x… 文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器Garbage First垃圾优先 总结 引言
上次面试腾讯让我说了一下垃圾回收机制虽然大概都说出来了但是觉得还是有不够详细今天好好整理一下下次不会这么狼狈了
正文
指针引用 Java中对象的访问是需要通过引用进行判断的引用主要分为其中按照强度递减分别是强软弱虚 强引用 通过new创建的对象直接用赋值如果还存在强引用垃圾回收器绝对不会回收他 软件引用 需要使用SoftReference进行声明如果内存不够了要报异常了这里就要的优先回收软引用用于对象缓存 Obj obj new Obj();
SoftReferenceObj sr new SoftReferenceObj(obj)弱引用 描述非必须的对象当一个对象只有弱引用只要发生GC一定会被回收 Obj obj new Obj();
WeakReferenceObj sr new WeakReferenceObj(obj)虚引用 最弱的引用形同虚设仅仅是当前对象被回收了我能收到通知
可达性分析算法 通过一系列GC Root的根对象作为起始节点然后根据引用关系向下搜索搜索走过的路径就是引用链。 GC Root不可达说明对象不再被使用GC Root可达说明对象仍旧在使用 固定为GC Root的对象有以下几种 在虚拟栈中引用的对象在方法区类静态属性引用的对象在方法区常量引用的对象在本地方法栈中Native方法引用的对象Java虚拟机内部的引用同步锁持有的对象
垃圾回收算法
标记清除算法
找出所有对象将存活对象进行标记然后清理掉未标记的对象结束。
标记整理算法
首先找出所有对象将存活对象进行标记然后将存活对象整理一端将内存区域直接清除掉
复制
将内存划分为大小相等的两块每次只使用其中一块当这一块内存用完了就将存活对象复制到另外一块上然后再将使用过的内存空间进行一次清理
分代收集
根据对象的存活周期将内存划分为几块不同块采用不同的收集算法。一般分为新生代和老年代 新生代 绝大多数的对象都是活不过一次垃圾回收使用复制算法 老年代 大多数是熬过了很多次垃圾回收过程的对象。标记清除 或者 标记整理算法
垃圾收集器
目前常用的hotpot虚拟机支持其中垃圾收集器可以混用。
Serial收集器
基本流程 暂停所有的工作线程专门进行垃圾回收 针对对象 新生代 算法 复制算法
ParNew并行收集器
多线程版的Serial收集器基本流程 暂停所有工作线程使用多线程进行垃圾回收 针对对象 新生代 算法 复制算法
Parallel Scavenge吞吐量优先收集器 多线程垃圾收集器尽量压缩垃圾收集时用户线程的停顿时间 基本流程 暂停所有工作线程使用多线程进行垃圾回收 针对对象 新生代 算法 复制算法 注意 需要控制最大垃圾收集停顿时间设置吞吐量大小
Serial Old老年代收集器
Serial收集器的老年版使用标记-整理算法提供客户端模式下使用基本流程 暂停所有工作线程使用多线程进行垃圾回收 针对对象 老年代 算法 标记整理算法
Parallel old收集器 多线程垃圾收集器尽量压缩垃圾收集时用户线程的停顿时间 基本流程 暂停所有工作线程使用多线程进行垃圾回收 针对对象 老年代 算法 复制算法 注意 应用于处理器资源较为稀缺的场合考虑使用Parallel Scavenge 和 Parallel Old一块使用
CMS收集器 追求最短停顿时间的垃圾收集器 基本流程 初始标记 停下所有线程仅仅标记一下GC Root能够关联的对象 并发标记 用户线程并行进行GC Roots Tracing耗时最长 重新标记 修正并发期间因为程序调用导致的标记变动停下所有工作线程耗时较短 并发清除 用户线程并行清除掉死亡对象 总结 吞吐量低但是停顿时间少完成垃圾回收时间长但是是并行的使用标记清除算法内存空间不连续大量的空间碎片
G1收集器Garbage First垃圾优先 将内存进行分区然后进行回收价值和成本排序价值越高成本越低的区块优先回收。 特性和问题总结 将整个堆分成大小相同的Region区域每一个都是Region都可能是新生代、老年代、Eden空间和Survivor空间G1每次收集的时候只会收集部分Region每次收集时会先估算每一个小块存活对象的总数回收垃圾最多的小块会先被收集 对于跨Region的引用对象使用记忆集解决并发标记阶段如何保证收集县城和用户线程互不干扰的运行 回收过程中改变对象引用关系通过原始快照SATB算法实现回收过程中创建新对象使用单独的分区和指针TAMS保存新创建的对象 四个步骤 初始标记 仅仅标记一下GC Root能够关联的对象停顿一下 并发标记 进行可达性分析完成对象图扫描判断存活对象和可回收对象处理STAB记录的是否有引用变动的对象 最终标记 暂时停顿查看处理并发阶段结束后少量的SATB记录 筛选回收 根据统计的回收价值和成本并排序筛选region进行回收使用标记复制的算法实现
总结
这里是粗浅的理解后续会在有补充有很多问题都没有解决包括怎么进行GC调优呀等等都没有看