JVM学习(四)——gc回收机制

最近复习Java基础细节的时候看Thking in Java;书上有提到两种垃圾回收机制,“停止-复制”、“标记-清扫”;


  • 停止-复制:将暂停程序的运行,然后将所有存活的对象从当前堆复制到另一个堆,而没有被复制的对象都是垃圾;当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑排列;然后就可以直接分配新空间了

  • 标记-清扫:从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象;每找到一个存活对象,就会给对象一个标记,这个过程不会回收任何对象;当全部标记工作完成时,清扫动作开始;

JVM采用自适应的垃圾回收机制:JVM会进行监视,若所有对象都很稳定,垃圾回收器效率降低,就切换为“标记-清扫”模式;当JVM跟踪“标记-清扫”的效果,发现堆空间有很多碎片时,就会切换回“停止-复制”方式;

垃圾回收

垃圾回收又称gc,gc是运行在JVM中,回收应用程序中创建的无用的对象

什么是垃圾

垃圾就是没有任何价值,没有任何用的东西

如何判断垃圾

Java通过引用于对象进行关联,操作一个对象;被引用相关联的就不是垃圾;
那么没有引用指向这个对象,也就是说该对象已经没有任何引用,那么它就是垃圾;

判定“垃圾”的方法

  • 引用计数算法
    1.给对象添加计数器,如果引用,计数器+1;
    2.引用失效,则计数器-1;
    3.任何时刻计数器为0的对象不能再使用了

  • 根搜索法
    1.gc roots为起点,从这个节点开始向下搜索
    2.所走过的路径,用Wie引用链
    3.对象到gc roots没有任何链相连,对象不可用

常见的垃圾回收场景

  • 对象被赋值null,或手动释放

  • 弱引用
    若一个对象具有弱引用,在GC线程扫描内存区域的过程中,不管当前内存空间足够与否,都会回收内存,使用弱引用 构建非敏感数据的缓存。

弱引用申明:

WeakReferenceweakReference=new WeakReference(new User());
  • 虚引用
    如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列联合使用,虚引用主要用来跟踪对象 被垃圾回收的活动。

虚引用申明:

PhantomReference phantomReference=new PhantomReference(new User(),new ReferenceQueue());

gc回收器

  • gc的划分
    新域:储存所有生成的对象
    旧域:新域中的对象经过几次gc之后,没有被回收,进入旧域中
    永久域:存储类和方法对象,从配置的角度看,这个域是独立的,不包括在JVM堆内。默认为4M。
  • 新域
    新域中会被分为三个部分:一个缓冲区,两个休闲区
    新域中,产生的大部分对象都会被回收,少部分进入旧域

1.第一个部分叫做Eden(伊甸园)
2.辅助的生成空间(幼儿园)
A空间…
B空间…

  • 旧域
    旧域也被分为几部分,但是旧域中,存活的对象就比较多,所以,旧域中一般回收的对象会比较少

  • 永久域
    一路下来,如果对象还未被回收,那么久会流入永久域中存起来,并不是对象到这里了,gc就不去回收了,只是gc不太会去回收这里面的对象。

垃圾回收器算法

  • Mark-Sweep算法

  • Copying算法

  • Mark-Compact算法:为了解决空间浪费问题而改进的算法;
    1.标记阶段和Mark-Sweep一样
    2.完成标记后,不直接清除回收对象,将对象移向一段
    3.清理边界内存

  • Generational Collection算法(分代收集法):根据存活的生命周期分为了:新生代,老年代和永久代,也就是新区,旧区和永久区

1.根据存活的生命周期将内存分为若干个区:新生代和老年代和永久代
2.新生代:每次都回收大量对象——>Copying复制法
3.老年代:每次都回收少量对象——>Mark-Compact法
4.永久代:存储class类,常量,方法描述:回收废弃常量和无用类

看了CSDN上曾淘前辈的这篇博文后,我想分代收集法应该就是Thking in Java中所描述的自适应方法


出处:http://blog.csdn.net/u011546655/article/details/52186044
资料借鉴:《Thking in Java》

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

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 88,673评论 17 311
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,878评论 2 31
  • 一. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对...
    Stan_Z阅读 1,850评论 0 25
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 3,816评论 0 18
  • 来自: Android梦想特工队作者: Aaron主页: http://www.wxtlife.com/原...
    技术特工队阅读 4,288评论 0 28