如何判断对象死亡及垃圾收集算法和垃圾收集器

垃圾收集器在对堆进行回收前,第一件事情就是要确定对象中哪些还“活着”,哪些“已死”。

一、如何判断对象已死

1) 引用计数算法

给对象添加一个引用计数器,每当又一个地方应用它时,计数器值加1;当引用失效时,计数器值减1;任何时刻计数器值为0的对象是不可能再被使用的。
引用计数器算法实现简单,判定效率也很高,在大部分情况下是个不错的算法,但是在主流的Java虚拟机里没有选用引用计数算法来管理内存,其主要原因它很难解决对象之间的相互循环引用的问题

2) 可达性分析算法

这个算法就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。


可达性分析算法判定对象是否可回收.png

可作为GC Roots的对象包括下面几种:
1.虚拟机栈(栈帧中的本地变量表)中引用的对象;
2.方法区中类静态属性引用的对象;
3.方法区中常量应用的对象;
4.本地方法栈中JNI(即一般说的Native方法)引用的对象;

JDK1.2后,Java对应用的概念进行扩充,将引用分为强引用,软引用,弱引用,虚引用
强引用类似“Object obj = new Object()”这类引用,只要强引用还存在,垃圾回收器永远不会回收掉被引用的对象。
软引用有用非必须的对象,当发生内存溢出时会把这些对象列进回收范围之中进行第二次回收。提供了SoftReference类来实现软引用。
弱引用也是非必须对象的,只能生存都下次垃圾收集发生之前。提供了WeakReference类来实现引用。
虚引用称为幽灵引用或者幻影引用,一个对象是否是有虚引用存在,完全不对堆其生存时间构成影响,也无法通过一个虚引用来获取一个对象的实例。为一个对象设置虚引用的唯一目的就是能在这个对象被垃圾收集器回收是收到一个系统通知。提供PhantomReference类来实现虚引用。

二、垃圾收集算法

1) 标记-清除算法

首先是标记出所有需要回收的对象,在标记完成后统一回收所有标记的对象。
主要的不足:
一个是效率问题,标记和清除两个过程效率都不高;
另一个是空间问题,标记清除之后会产生大量的不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不出发另一次垃圾收集动作

2) 复制算法

他将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上,然后把已使用过的内存空间一次清理掉。
这种算法实现简单,运行效率高。不足是将内存缩小为yuanli的一半,代价未免太高
商业虚拟机都采用这种收集算法来回收新生代。新生代的对象98%是“朝生夕死”,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收是,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,由于我们没法保证每次护手都不多余10%的对象存活,当Survivor空间不足时,需要依赖其它内存(这里指老年代)进行分配担保。

3) 标记-整理算法

复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低。更关键的是如果不想浪费50%的空间,就需要额外的空间担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以老年代一般不能直接选用这种算法。
标记-整理算法,首先是标记出所有存活的对象,将存活的对象都移向一端,然后清理掉端边界以外的内存。

3) 分代收集算法

根据对象存活的周期不同将内存划分为几块。一般把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批的对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代存活率高、没有额外空间对它分配担保,就必须使用“标记-清理”或者“标记-整理”算法来进行回收。

三、垃圾收集器

基于JDK1.7 Update 14之后的HotSpot虚拟机,这个虚拟机包含的所有收集器如图:


HotSpot虚拟机的垃圾收集器.png

现在用的基本都是CMS,则这里只说CMS收集器:CMS收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。

CMS优点就是:并发收集,低停顿
CMS缺点:
1)CMS对CPU资源非常敏感,会导致应用程序慢,总吞吐量降低;
2)CMS无法处理浮动垃圾;
3)是一款基于"标记-清除"算法实现的会产生大量的空间碎片。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容