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

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

  • 相关阅读:
    668. Kth Smallest Number in Multiplication Table
    658. Find K Closest Elements
    483. Smallest Good Base
    475. Heaters
    454. 4Sum II
    441. Arranging Coins
    436. Find Right Interval
    410. Split Array Largest Sum
    392. Is Subsequence
    378. Kth Smallest Element in a Sorted Matrix
  • 原文地址:https://www.cnblogs.com/vingLiu/p/10657458.html
Copyright © 2011-2022 走看看