zoukankan      html  css  js  c++  java
  • Java垃圾回收之回收算法

    问题:谈谈你了解的垃圾回收算法

    1、标记-清除算法(Mark and Sweep)

      标记:从跟集合进行扫描,对存活的对象进行标记

      清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存

    优点:简单

    缺点:容易出现碎片

    这个算法会导致出现大量的不连续的内存碎片,可能会导致在之后的分配较大的对象时,无法找到足够的连续内存,会触发另外一次垃圾回收。上图就出现了三个内存碎片块

    2、复制算法(copying 适用于对象存活率低的场景,年轻代)

       2.1 分为对象面和空闲面

      2.2 对象在对象面上创建

      2.3 存活的对象被对象面复制到空闲面

      2.4 将对象面所有对象内存清除

    优点:

    1、解决碎片化问题

    2、顺序分配内存,简单高效

    3、适用于对象存活率低的场景

    缺点:

    1、在面对对象回收率高的情况下,就显得力不从心了。要进行较多的复制操作,效率将会变低,

    2、更关键的是:如果不想浪费50%的空间,就需要额外的空间进行分配和担保,为应对对象面中对象100%存活的极端情况。

    3、标记-整理算法(Compacting,适用于老年代中)

      标记:从根集合进行扫描,对存活的对象进行标记

      清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收

    优点:

    解决了标记-清除算法导致的碎片化问题(避免了内存的不连续性)

    不用设置两块内存互换

    适用于存活率高的场景

    4、分代收集算法(Generational Collector)

      4.1 垃圾回收算法的组合拳

      4.2 按照对象生命周期的不同划分区域以采用不同的垃圾回收算法(怎样判断对象的生命周期?)

      4.3 目的:提高JVM的回收效率

    (三个模块,年轻代,老年代,永久代)

    -------------------------------------------

    (永久代被取消了,只剩下,年轻代----》复制清除算法  和   老年代---》标记清除算法或标记整理算法)

    分代收集算法的GC分类

    Minor GC---->采用复制算法,用于年轻代中

    Full GC ------>

    年轻代:尽可能快速地收集掉那些生命周期短的对象

      Eden区----》对象刚刚被创建就是放在这里,当然,如果这里不够放,就会放到survivro或老年代上

      两个Survivor区---》

    -XX: MaxTenuringThreshold  这个参考可以设置对象的“岁数”,默认对象的岁数是15岁,超过这个值就被转移到老年代---》经过15次minor gc回收之后,还存活下来的对象

    问题:对象如何晋升到老年代中?

       1、经历一定Minor次数依然存活的对象

       2、Survivor区中放不下的对象

       3、新生成的大对象(-XX: +PretenuerSizeThreshold )

    常用的调优参数:

      -XX:SurvivorRatio: Eden 和其中一个Survivor的比值,默认8:1

      -XX:NewRatio :老年代和年轻代内存大小的比例

      -XX: MaxTenuringThreshold :对象从年轻代晋升到老年代经过GC次数的最大阀值

    老年代:存放生命周期较长的对象----》采用标记-清理算法 或  标记-整理算法

      1、Full GC 和 Major GC(一般的理解是Full GC等于 Major GC,收集整个GC堆。注意:如果有人问你Major GC的时候,一定要问清楚是Full GC 还是仅仅指老年代的GC

      2、Full GC 比 Minor GC 慢,但执行频率低

    问题:什么时候触发Full GC?什么条件?

      1、老年代空间不足(为了避免Full GC的发生,就避免产生大对象的生成)

      2、永久代空间不足(这个只是针对JDK7和以前的版本,这也是为什么用元空间替代永久代的原因,为了降低Full GC的频率!!!!

      3、CMS GC时出现 promotion failed ,concurrent mode failure 

      4、Minor GC晋升到老年代的平均大小大于老年代的剩余空间

      5、调用System.gc()----->注意:这只是码农提醒虚拟机进行Full GC操作,实际上还是在不确定的时上进行Full GC

      6、使用RMI 进行RPC或管理的JDK应用,每小时执行1次Full GC

      (一般能说出三点就可以,三点以上就更好)

  • 相关阅读:
    CSS颜色十六进制值规律
    linux清理内存命令
    一些常用的linux命令
    读《DOOM启示录》随想
    日常分享:关于时间复杂度和空间复杂度的一些优化心得分享(C#)
    .netcore过滤器有以下几种类型
    RabbitMQ十:重要方法简述(参数)
    git 配置 ssh
    log4net学习笔记
    redis下载与安装
  • 原文地址:https://www.cnblogs.com/vingLiu/p/10657458.html
Copyright © 2011-2022 走看看