JVM内存回收策略(GC)

1.静态内存分配和回收

    静态内存空间是在Java栈上分配的(编译时就确定的),当这个方法结束的时候,对应的栈帧也就取消,且静态内存空间也就回收了(针对栈帧而言)。

2.动态内存分配和回收

    JAVA中对象的内存空间是动态分配的,所谓的动态分配就是在程序执行时才知道要分配的存储空间大小,而不是在编译时就能够确定的。

    针对堆中对象什么时候不被使用,又如何来回收它们,这正是JVM的一个很重要的组件-----垃圾回收器要解决的问题。


垃圾检测的算法:

    1.引用计数算法

    2.可达性分析法

垃圾回收算法:

1.基于分代的垃圾回收算法

        该算法设计思路:把对象按照寿命长短来分组,分为年轻代和年老代,新创建的对象分在年轻代,如果对象经过几次回收之后依然存活,那么再把这个对象划分到年老代。年老代的收集频率不像年轻代那么频繁,这样就减少了每次垃圾收集需要扫描的对象个数,从而提高了垃圾回收的效率。

    这种思路是把堆划分成了若干个子堆,每个子堆都对应一个年龄代。

            分别是:    (1)新生代(Young区)其中Young区又分为Eden区和两个Survivor区。

                               (2)老年区(Old区)

                               (3)永久区(Perm区)

    Young区又分为Eden区和两个survivor区,其中所有新创建的对象都在Eden区,当Eden区满了之后会触发minor GC将Eden区仍然存活的对象复制到其中一个Survivor区中,另外一个Survivor区中的存活对象也复制到这个Survivor中,以始终保证有一个Survivor区是空的。如果Survivor区也满了,GC收集器会将这些对象直接存放到Old区。如果在Survivor区中的对象足够老,也会被直接放到Old区。最终OLD区也满了的时候,就会出发Full GC,直接回收整个堆内存。

Perm区存放的是Class对象和ClassLoader。如果Perm区满了,同样触发Full GC。

SUN官方建议:Young区大小为整个堆大小的1/4

Young中的Survivor一般为整个堆大小的1/8

总结:当OLD区满了的时候和永久区满了的时候就会触发FULL GC.

2.标记-清除算法:

标记过程:引用计数法,可达性分析

CMS收集器就采用此算法,缺点是会产生大量的不连续的内存碎片,不利于后续装入大对象的操作。

3.复制算法:

    把容量分成相同两个部分,每次使用其中一块,当其中一块用完了,复制对象到另一块上面去。现在的虚拟机大多使用这个方法来手机新生代中的对象,到survivor区中。


4.标记-整理算法

    标记过程:引用计数和可达性分析

    整理算法不是对可回收对象进行清理,而是把对象都向一端移动,然后直接清理掉端边界以外的内存。





4.Hotspot提供了6个垃圾收集器:

1.Serial 收集器(Client模式下默认):

    是单线程的新生代垃圾收集器

    新生代采用复制算法暂停所有用户线程。

    老年代采用标记-整理算法暂停所有用户进程。

2. ParNew 收集器

    是上面Serial收集器的多线程版本,在单CPU下表现不如Serical 收集器

3.Paralllel Scavenge 收集器

    和ParNew类似,目的是达到可控制的吞吐量,可以指定吞吐量大小时间

4.Serical Old收集器

    Serial Old是Serial收集器的在老年代的版本,同样是单线程

5. Parallel OLD 收集器

    同样是Parlllel Scavenge收集器的老年代版本

6. CMS (Concurrent Mark Sweep)收集器

    CMS收集器是一种获取最短回收停顿时间为目标的收集器。

    基于 标记-清除 算法实现


Eden(新生代中的一部分):对象优先在Eden中分配,当Eden没有足够空间进行分配的时候,虚拟机将发起一次MinorGC.

老年代:大对象直接进入老年代,长期存活的对象将进入老年代。

Minor GC:一般当新对象生成,并且在Eden申请空间失败时,触发。将清除Eden区的非存活对象,并把存货对象移动到Survivor,然后整理两个Survivor区。该方式不会影响到老年代,此外,该GC推荐使用速度快,效率高的算法,使Eden区尽快空闲出来。

Full GC:对整个堆进行整理,包括Young、Tenured和Perm,因此为了提高系统性能,需要减少FullGC的次数。发生FullGC的场景有:年老代写满,持久代被写满和System.gc()被显示调用,上一次GC后Heap各域分配策略动态变化。

    

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

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,366评论 17 311
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 5,946评论 2 31
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,644评论 0 7
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,350评论 1 56
  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 4,517评论 4 86