读书笔记-Java中垃圾收集器与内分分配策略

Java中可达性分析算法

  • Java语言中,可以作为GC Roots的对象有以下几种:
  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

Java中的四种引用类型

  • 强引用(Strong Reference),只要引用还在,垃圾回收器就不会回收该对象
  • 软引用(Soft Reference),系统马上将要OOM了,就会优先回收掉该弱引用的对象
  • 弱引用(Weak Reference),来GC操作了,马上回收掉该引用的对象
  • 虚引用(Phantom Reference),也叫幽灵引用。完全不会对对象的生存时间产生影响(为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收到一个系统通知)

对象的回收

  • Java可达性分析算法中,即使被标记为“不可达”的对象,也不会立即回收,至少需要经历两次标记过程;如果对象在进行分析后,发现没有引用链,那么会被标记执行一个筛选的操作,筛选的条件是该兑现是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机将这两种情况都是为“没有必要执行”
  • 如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个叫做F-Queue的对队列中,并在稍后由一个由虚拟机自动创建的、低优先级的Finalizer线程去执行。

回收方法区

  • 方法区中进行垃圾手机的性价比一般比较低;在堆中,尤其是在新生代中,常规应用的一次垃圾收集一般可以回收70%~90%的空间,而永久带的垃圾收集效率远低于此
  • 方法区的垃圾回收一般包含两种:废弃常量无用的类
  • 废弃常量只要没用引用就可以回收,但是无用的类判定条件非常的苛刻,需要满足以下三个条件
    1.该类所有实例已经被回收
    2.加载该类的ClassLoader已经被回收
    3.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法

垃圾回收算法

标记-清除法

  • 标记-清除(Mark-Sweep)算法,作为最基本的算法,主要包含标记清除*两个阶段:
  • 标记阶段中,统一标记所有要回收的对象,清除阶段根据之前的标记进行回收。大概的过程如下:



  • 这种算法主要有两点不足
    1.效率性:标记和清除这两个过程的效率都不高
    2.空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作

复制算法

  • 复制算法将内存按照容量划分为大小相等的两块,每次只使用其中一块。一块内容使用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。这样做每次都是针对整个半区进行清理回收,内存分配时也就不用考虑内存碎片等复杂的情况,只要一动堆顶指针,按顺序分配内存即可,实现简单,运行高效。示意图如下:


  • 这种算法的缺点是,可用内存缩小为原来的一半,代价比较高
  • 分代方式也是采用的这种算法来回收新生代的内存

标记-整理算法

  • 复制收集算法在对象存活率较高时,就要进行多次的复制操作,效率就会变低。更关键的是,如果不想浪费50%的空间,就需要额外的空间进行分配担保,以应对被使用的内存中所有对象都被100%存活的极端情况,所以在老年代一般不能直接采用这种算法
  • 标记-整理(Mark-Compact)算法的过程与标记-清除算法过程一致,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存,示意图如下:

分代收集算法

  • 这种算法将内存划分为几块区域进行分别管理。Java将堆分为新生代和老年代,这样就可以根据各个年代的特点采用最释放的手机算法。在新生代中,每次垃圾收集都伴随着大批对象的清除,只有少量存货,那么就算用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率较高,没有额外空间可以进行分配担保,就必须采用标记-清除或者标记-整理算法来进行回收

垃圾收集器种类

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