GC

对象是否存活的算法:
  1. 引用计数法:无法解决循环引用的问题。
  2. 可达性分析法:GCRoots 可达。
GCRoots对象:
虚拟机栈中的引用对象
方法去静态变量
方法区中的常量
本地方法(JNI)栈中的引用对象
垃圾回收算法:
  1. 标记清理:根据可达性分析,标记不再引用的对象(标记过程会stop the world),然后再进行清除操作。空间碎片的问题。
  2. 复制算法:一般用于年轻代,数据较小的区域。存活率较高时,需要进行较多的复制操作;还有空间浪费等问题。
  3. 标记整理:标记,然后整理对齐,处理空间碎片的问题,存活对象都移动向一端,然后直接清理掉端边界意外的内存。
  4. 分代手机算法:年轻代使用复制算法;老年代使用标记清理或标记整理
堆的分代
  1. 年轻代:年轻代又分为一个 Eden区和两个Survivor区
  2. 老年代
垃圾回收的整个过程:
  1. 如果设置了 -XX:MaxTenuringThreshold, 会先判断对象是否大于该值,大于就直接放到老年代。
  2. 看 Eden 区是否能放下,能放下直接放Eden区;
  3. Eden 区放不下会触发一 YoungGC(MinorGC),存活的对象会被放到 survivor 的 to 区,对象头中的 age 加 1,MinorGC还同时会对 from 区的对象进行标记,存活对象 age 等于 15 的会被移动到老年代,存活且年龄小于15的会被放到 to 区,age加 1;此时 from 区所有对象都被转移,清空 from 区,然后 from 和 to 区域互换。
  4. 对象放到老年代,若空间不足会触发 FullGC
  5. 分配担保,在进行 MinorGC 前会先比较当前年轻代对象总大小是否小于当前老年代最大可用连续空间大小,若小于会认为此次 MinorGC 为安全的;若大于,会认为 MinorGC 有一定风险,此时会比较老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,若大于,会尝试进行一次 MinorGC,若小于改为进行一次 FullGC。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JVM内存管理 根据JVM规范,JVM把内存划分成了如下几个区域: 方法区(Method Area) 堆区(Hea...
    Android_冯星阅读 797评论 0 5
  • GC与内存分配策略 1 概述 说起垃圾回收机制,大部分人都把这项技术当做java语言的伴生产物。事实上,gc的历史...
    勾小超爱吃面阅读 931评论 0 2
  • 前言 开设JVM系列以后,就一直打算写写GC这块的事情。总体上来说这块也算是比较偏理论,很多时候是看的时候理解了,...
    耐得千事烦阅读 739评论 1 2
  • 这次来说一下关于Java垃圾收集的一些思想和算法。 垃圾收集的触发条件 1)因为GC线程的优先级较低,所以当虚拟机...
    nemuni阅读 745评论 3 1
  • 一、Java垃圾回收概况 概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,...
    极客天空阅读 499评论 0 1

友情链接更多精彩内容