zoukankan      html  css  js  c++  java
  • 2、垃圾回收与算法

    1、解决哪些内存需要回收;
    2、什么时候回收;
    3、如何回收;
    如果一个对象是gc.root不可达,先判断他的finalize方法有没有被重写,没有重写直接回收,如果重写,则放在一个叫F-QUEUE的队列用,由一个线程去执行对象的finalize方法,
    执行完finalize方法后,回收的时候会再次判断是否是gc,root不可达的;这个是对象的一次自救的机会;

     

     

    JVM的垃圾收集算法
    1.标记-清除算法
    这是最基础的收集算法,(Mark-Sweep),就如同名字所表达的一样,扫描整个内存区域,对可回收的对象进行标记,当扫描完时,再清除所有被标记的对象。
    此算法的缺点有以下两点
    效率不高。
    会产生内存碎片,所谓内存碎片就是不连续的内存区域,这样可能会导致虽然有足够的内存但是却没有足够大的连续内存去分配给一个比较大的对象,从而导致一次FULL-GC

    2.复制算法
    复制算法的思想主要是将内存区域分成两部分,在分配内存的时候只使用其中的一部分内存,即任何时刻都保证有一部分是没有使用过的,每次收集的时候都将存活的对象复制到另一块区域,然后收集结束后直接清空当前扫描的区域。

    3.标记-整理算法
    这种算法就是对标记-清除算法的改进,即清理完可回收的对象后,将仍然存活的对象向一端移动,这样就不会造成内存碎片。

    4.分代收集算法
    分代收集算法是根据对象的存活周期的不同将内存划分为几块,对这些不同的区域采用不同的算法。
    大部分实现的虚拟机是讲java堆分为新生代和老年代,一般来说对新生代采用的是复制算法,对老年代一般采用标记-清除或者标记-整理算法

    新生代的内存模型

    垃圾收集器:

    有连线代表可以配合使用

    总结:

    1、单线程+复制算法=Serial收集器;

    2、单线程+标记整理算法=SerialOld收集器;

    3、多线程+复制算法=ParNew收集器/Parallel Scavenge收集器;

    4、多线程+标记整理算法=Parallel Old收集器;

    垃圾收集器就是对垃圾收集算法的实现,按照分代收集的思想,垃圾收集器可以分为新生代收集器和老生带收集器,按照回收线程数来分,又可分为单线程收集器和多线程收集器。
    1.Serial收集器:是最基本,历史最悠久的收集器,它是一个单线程收集器,且工作时必须停止所有用户线程,这是用于新生代的收集器,所以采用了复制算法,它是client模式下默认的新生代收集器。
    2.ParNew收集器:其实就是Serial收集器的多线程版,是Server模式下默认的新生代收集器,只有它和serial收集器可以配合CMS收集器一起工作。
    3.Parallel Scavenge收集器:也是新生代收集器,多线程回收,看起来似乎和ParNew收集器没有什么区别,它的特点就是关注点和其他收集器不同,ParNew收集器注重将每次GC的时间尽量缩短,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量,所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,吞吐量= 运行用户代码总时间 / (运行用户代码总时间 + 垃圾收集时间),吞吐量高可以最高效率的利用CPU时间,尽快完成程序的运算任务,主要适用在后台运算而不需要与用户进行太多交互的任务,可以通过-XX:MaxGCPauseMillis和-XX:GCTimeRatio来设置吞吐量。
    4.serial Old收集器:是serial收集的老年代版本,同样是单线程收集器,使用的是标记-整理算法。
    5.Parallel Old收集器:是Parallel Scavenge收集器的老年代版本,多线程收集器,使用标记-整理算法,和Parallel Scavenge配合可以做到吞吐量最大优化
    6.cms收集器-面向服务端的一个垃圾收集器,基于标记-清除算法的收集器,是一款真正实现并发收集的收集器,即在GC的时候不会停止用户线程,整个过程分为4步:1、初始标记 2、并发标记 3、重新标记 4、并发清除,其中初始标记和重新标记仍然需要停止用户线程,但停顿时间都不会很长,它是一款优秀的收集器,并发收集低停顿,但也有一些缺点:1、CMS收集器对CPU资源比较敏感,为是并发的,它虽然不会导致用户线程停顿,但会因为占用CPU资源而导致应用程序变慢,总吞吐量下降。2、无法处理浮动垃圾,浮动垃圾就是在并发清除时由于用户线程运行而产生的垃圾,CMS收集器无法在本次收集中清理他们,也是由于在收集阶段用户线程需要运行,所以需要预留一部分空间给用户线程使用。3、由于采用的是标记-清理算法,会产生内存碎片。

    7.G1收集器:-面向服务端的一个垃圾收集器,CMS的高级版本,能处理浮动垃圾,把内存区域分为多个Region,每次决策都分析在满足限定条件内region,选择回收那些region;

    Minor gc与Full gc的区别

    Minor gc是新生代gc,M gc非常频繁,一般回收速度也快;

    Full gc是对老年代gc, F gc比M gc慢10倍以上;

  • 相关阅读:
    Tomcat 7 简单定制
    Tomcat 启动卡在 Root WebApplicationContext: initialization completed in
    nacos 1.1.x 集群部署笔记
    ERROR 1044 (42000): Access denied for user 'root'@'localhost'
    logrotate 不生效
    Keepalived + Haproxy + PXC 理论篇
    Percona MongoDB 4 搭建副本集
    装饰器模式
    上拉电阻和下拉电阻
    Arduino基本数据类型
  • 原文地址:https://www.cnblogs.com/yeyongjian/p/9246283.html
Copyright © 2011-2022 走看看