zoukankan      html  css  js  c++  java
  • G1垃圾收集器【常考】

    常考

    以前垃圾收集器的特点:

    young区和old区是各自独立且连续的内存块 
    年轻代收集使用单eden区+survivor0区+survivor1区进行复制算法 
    老年代收集必须扫描整个老年代区域 
    都是以尽可能少而快速的执行GC为设计原则

    描述:

    G1收集器是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求,它具有以下特性:

    1. 像CMS收集器一样,能与应用程序并发的执行
    2. 整理空闲空间更快
    3. 需要更多的时间来预测GC停顿时间
    4. 不希望牺牲大量的吞吐性能
    5. 不需要更大的java heap
    和CMS比较:

    G1不会产生很多内存碎片【标整算法】; 
    G1的stop the world更可控,他在停顿时间上添加了预测机制,用户可以指定期望停顿的时间 
    主要改变是Eden区,survivor区,tenured区等内存区域不再是连续的了,而是变成了一个个大小一样的region,每个region从1M到32M不等,一个region有可能属于Eden、survivor、tenured内存区域

    特点:
    1. G1整体上采用标记-整理算法,局部是通过复制算法,不会产生内存碎片
    2. 宏观上看G1之中不再区分年轻代和老年代,把内存划分成多个独立的子区域,可以近似理解为一个为期的棋盘
    3. 但其本身依然在小范围内要进行年轻代和老年代的划分。保留了新生代和老年代,但他们不再是物理隔离的,而是一部分Region的集合,且不需要Region是连续的,也就是说依然会采用不同的GC方式来处理不同的区域
    4. G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代与老年代的区别,也不需要完全独立的survivor堆做复制准备。G1只有逻辑上的分代概念,每个分区都可能随G1的运行在不同代之间前后切换
    底层原理:
    Region区域化垃圾收集器:

    最大的好处是避免全内存扫描,只需要按照区域来进行扫描即可 
    核心思想是将整个堆内存划分成大小相同的子区域Region,在启动时可以设置参数 -XX:+G1HeapRegionSize=n 指定分区大小(1MB~32MB,必须是2n),默认将整堆划分为2048个分区

    这些Region一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或survivor空间 
    这些Region一部分包含老年代,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这意味着,在正常处理过程中,G1完成了堆的压缩(部分堆的压缩),就没有了CMS的碎片问题

    在G1中,还有一种特殊的区域,叫Humongous区。如果一个对象占用的空间超过了分区荣来那个的50%以上,G1收集器就认为这是一个巨型对象,这些巨型对象默认直接会被分配在老年代,但是如果她是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响,为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象,如果一个Humongous区装不下一个巨型对象,那么G1会寻找连续的Humongous区来存储。为了能找到连续的Humongous区,有时候不得不启动Full GC

    回收步骤:

    youngGC:eden区耗尽时被触发。 
    Eden区的数据移动到survivor区,假如survivor区空间不够,Eden区数据会部分晋升到old区 
    survivor区的数据移动到新的survivor区,部分数据晋升到old区 
    最后Eden区收拾干净了,GC结束

    4步:

      1. 初始标记:只标记GC Roots能直接关联到的对象(和CMS一样需要暂停所有的工作线程)
      2. 并发标记:进行GC Roots跟踪的过程(和CMS一样不需要暂停工作线程)
      3. 最终标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象
      4. 筛选回收:根据时间来进行价值最大化回收
  • 相关阅读:
    Spring 签名加密+xml数据交互
    Spring 使用 RestTemplate 模拟 电商网站+支付平台
    SSM 框架搭建
    SpringMVC 登录验证实例
    四.Mybatis 动态sql语句
    三.Mybatis 多对一与一对多
    二.Mybatis 增删改查
    一.Mybatis 入门
    SSH框架搭建
    二)Spring AOP编程思想与动态代理
  • 原文地址:https://www.cnblogs.com/xhyouyou/p/12465438.html
Copyright © 2011-2022 走看看