垃圾回收算法

一,了解GC所关注的问题

  1. 什么时候回收
  2. 哪些内存需要回收
  3. 如何回收
    注: GC所关注的主要区域 是 Java堆 和 方法区,Java虚拟机规范中对于垃圾收集器如何实现没有任何规定

二,什么时候回收?

GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。

  • 对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快;
  • Full GC,发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个-XX:PretenureSizeThreadhold参数,令大于这个参数值的对象直接在老年代中分配,避免在Eden区和两个Survivor区发生大量的内存拷贝;
  • 发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次Full GC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行一次Minor GC,如果不允许,则改为进行一次Full GC。

三, 判断对象是否已死

  1. 引用计数算法
  • 内容:每当有一个地方引用它时,计数器加一,当引用失效时,计数器减一;任何时刻计数器为0的对象是不能再被使用的。
  • 优点:实现简单, 效率高
  • 缺点:难解决对象相互循环引用的问题
  1. 可达性分析算法
  • 内容:当一个对象到GC roots 没有任何引用链相连,此对象不可用
  • GC roots 包含 对象 1. 虚拟机栈中引用的对象 2.方法区中类静态属性引用的对象 3. 方法区中常量引用的对象 4.本地方法栈中 JNI (native 方法)中引用的对象 (为什么呢 ????)

四. 垃圾回收算法

  1. 标记-清除算法
  • 算法:标记所有需要回收的对象,在标记完成后统一回收所有被标记对象。
  • 缺点:1. 标记和清除的效率不高 2.清除后会产生大量不连续的内存碎片
  1. 复制算法
  • 算法:将可用内存分成大小相等的两块,每次只使用其中的一块,当这块用完了,就将还存活的对象复制到另一块上,然后清理掉一整块用过的内存空间
  • 优点:实现简单,运行效率高
  • 缺点:内存缩小为原来的一半,存活率较高时就需要较多的复制操作,效率降低
  1. 标记整理算法
  • 算法:标记所有需要回收的对象,将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
  • 解决了 标记清除算法 产生大量不连续的内存碎片问题
  1. 分代收集算法
  • 算法:Java 堆 分为 新生代 和 老年代,根据各个年代的特点采用最适合的收集算法。新生代 有大批对象死去,选用复制算法;老年代 对象存活率高,没有额外空间对它进行分配担保,采用 标记清理,标记整理算法回收

问题

  1. 是怎么标记要回收的对象
    如果对象在进行可达性分析后发现没有与 GC Roots 相连接的引用链,那么它将会被第一次标记并且进行一次筛选,筛选条件(对象是否有必要执行finalize()),当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过都视为“没有必要执行”,如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会放置在F-Quene 的队列之中,稍后GC将对队列上的对象进行第二次小规模标记,如果对象在finalize()中成功拯救自己--只要重新与引用链上任何一个对象建立关联即可,那么第二次标记时它将被移除“即将回收”的集合,如果没有逃脱就被标记为要回收的对象
  2. GC roots 对象为什么是定义那些
    待解决
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容