Java垃圾回收机制

垃圾回收机制主要分成垃圾标记和垃圾清除,今天就以这两块为切入点介绍

垃圾标记机制

先介绍一下Java之中的引用

1.强引用
当我们创建一个对象的时候,这个对象就具有强引用,垃圾回收器就算跑出OOM也不会回收它。
2.软引用
如果一个对象是软引用,当内存不够时,会回收这些对象的内存,回收后入股哦还不够,那么跑出OOM。Java提供了SoftRefrernce类来实现软引用。
3.弱引用
弱引用的生命周期更短,垃圾回收器一旦发现了只有弱引用的对象,那么会立刻回收,不管当前内存是否足够。Java提供了WeakReference类来实现弱引用。
4.虚引用
虚引用其实等同于没有引用,再任何时可都有可能被回收。只是一个具有虚引用的对象,被垃圾回收期回收时,会受到一个通知,这也是虚引用的主要作用。

引用计数标记算法

引用计数算法就是说,每当当前对象被引用一次,那么计数就加一,引用失效时计数就减一。当引用计数器的值变成0时,则该对象就不能被使用,变成了垃圾。
问题:引用计数器会产生一个比较尴尬的问题在于,两个对象不被外界引用,反而互相引用,就无法被发现。垃圾回收机制就无法清理他们。因此就产生了以下的另一种垃圾回收机制。

根搜索算法

跟搜索算法的思想就是选定一些对象作为GC Rooots,并组成跟对象集合,然后以这些GC Roots的对象作为起始点,向下搜索。如果目标对象到GC Roots是连接着的,我们既认为该目标是科大的,如果目标对象不可达,那么说明目标对象是可以被回收的。
可以作为GC root对象主要有以下几种:

  • Java栈中引用的对象
  • 本地方法栈中JNI引用的对象
  • 方法区中运行常量池引用的对象
  • 方法区中静态属性引用的对象
  • 运行中的线程
  • 由引导类加载器加载的对象
  • GC控制的对象
还有一个问题是,被标记为不可达的对象是否会被立即回收,下面就介绍一下对象的所有状态。

1.创建阶段
2.应用阶段
对象持有强引用,并且可见
3.不可见阶段
对象持有强引用,但是不可见,比如被jni所引用
4.不可达阶段
对象不再持有强引用
5.回收阶段
调用对象的finalize方法,并且垃圾回收器准备对该对象的内存空间进行重新分配
6.终结阶段
对象运行完finalize方法后,仍处于不可达状态,那么等待垃圾回收器回收该对象。
7.对象重新分配
重新分配完对象以后,这个对象等于被回收。

垃圾回收机制

说完标记算法,下面要介绍一下清除算法。

标记清除算法

对内存中的对象进行标记,分成存活对象和可回收对象。如果是可回收对象,那么就对当前对象进行回收。
标记算法主要有两个缺点,一个是标记和清除的效率不高,另外一个是容易产生大量不连续的内存碎片。碎片太多就会导致没有足够的连续内存空间用于存放大对象。从而提前触发一次垃圾回收机制。

复制算法

复制算法主要是为了解决效率不高的问题,它把内存等分成两块,一次只是用一般的内存,清除完内存以后,将当前剩余的对象复制到另一半的内存之中。缺点就是每次使用的内存大小只有原来的一半。但是针对对象较小,以及对象生命周期较短的场景,效率就会异常高。所以复制算法被大量使用于新生代中。

标记压缩算法

标记压缩算法可以理解是标记清除算法的一种升级,在标记逻辑上和标记清除算法是一样的,将对象标记成可回收,和存活对象。但是相比标记清除算法,在清除可回收对象以后,还会进行一个操作,那就是对当前对象进行压缩,把所有对象都压缩到内存的一端。
这样就可以解决标记清除算法会产生大量内存碎片的问题。

分代收集算法

先介绍两个概念

  • 新生代
    新生代分为三个空间区域,分别是eden,From Surivor 和 To Survivor
    每次进行新生代内存回收的时候,都会将eden和From Survivor的存活对象复制到To Survivor。然后将eden和from survivor的对象清空。接着将To survivor的对象复制到From survivor。
    当然有两种情况对象会被复制到老年代垃圾收集中。那就是对象存活时间超过一定时间,或者To survivor的对象超过阈值。
  • 老年代
    相比新生代,老年代收集就是使用上文介绍的标记压缩算法。主要也是用于存放那些周期时间较长的对象。所以他的收集频率较低,耗时较长。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 来自: Android梦想特工队作者: Aaron主页: http://www.wxtlife.com/原...
    技术特工队阅读 4,361评论 0 28
  • 一、垃圾回收机制的意义Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃...
    任任任任师艳阅读 632评论 0 0
  • 如果你想要从太空观察地球,卫星技术就能够做到这一点。图中的海洋流是卫星地图展现的,紫色和粉红色的漩涡代表更暖的洋流...
    allever阅读 1,393评论 0 8
  • 垃圾回收的意义 如果不进行垃圾回收,内存迟早会被消耗空。垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使...
    安静的蓝孩子阅读 12,605评论 0 7
  • 1. 垃圾回收的意义在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在...
    爱情小傻蛋阅读 924评论 0 11