GC与内存管理简记

本文详细介绍了Java垃圾收集器(GC)从V1.3的标记清除法到V1.8混合写屏障的演变,重点讲解了三色并发标记法、写屏障如何提高并发性和性能,以及内存管理中的mcache、mcentral和mheap的角色。
摘要由CSDN通过智能技术生成
  • GC

    • V1.3之前标记清除法:先标记到不了的内存的再清除,整个过程都需要stw

    • V1.5三色并发标记法,启用写屏障,重复遍历,开始全标记白,每一次扫描能到的白变灰、能到的对象标记灰变黑,直到只剩下到不了的对象标记白,最后清除白对象。不需要每次都扫描整个内存空间,可以减少stw的时间

    • V1.8 混合写屏障,采用插入写屏障和删除写屏障,一次找出所有黑不重复扫描,期间栈上新建的对象为黑色,(依赖关系)被删除和堆上添加对象标记为灰。期间仅开启和关闭屏障各需要一次stw

      • 不stw,两个问题会破坏回收
        • 黑色对象引用白色对象—对应强三色不变性:黑色对象不会指向白色,只会指向黑或灰

        • 灰色对象到白色对象的访问路径被破坏——对应弱三色不变性:黑色对象指向的白色对象必须受灰色保护

        • 插入写屏障满足强三色不变性,不存在黑色对象引用白色对象的情况了, 因为白色会变成灰色,可以在堆上被触发,在无stw下可与go程序并行执行而不会破坏垃圾回收

        • 删除写屏障满足弱三色不变性,断开处后面白色对象会变灰,保护灰色对象到白色对象的路径不会断,可以在堆上被触发,在无stw下可与go程序并行执行而不会破坏垃圾回收

        • 混合写屏障满足弱三色不变性

    • GC触发:手动触发调用runtime.GC阻塞式等待GC完成,被动触发每过两分钟或者内存使用增幅超一倍

  • 内存管理

    • span是内存管理基本单位,是一组连续的page。
    • mcache保存各种大小的span并按spanclass分类,小对象从mcache直接分配,每个p对应一个mcache,可无锁所访问。
    • mcentral是所有线程共享缓存需加锁访问,将spanclass分类并串成链表,每个类一条包含指针的链表,一条不包含指针的链表,mcache的span用光时向mcentral申请。
    • mheap是堆内存的抽象,mcentral的span不够用会向mheap申请且需要加锁访问,mheap不够会向os申请。mheap把span组织成两棵树
    • 内存分配分大、中、小、tiny对象分类,为(小于32kb)对象寻找span寻找span的流程如下:
      1. 计算对象所需内存大小size
      2. 根据size到size class映射,计算出所需的size class
      3. 根据size class和对象是否包含指针计算出span class
      4. 获取该span class指向的span
    • 大于32kb在mheap上分配,优先在free搜索,没有则从scav搜索,若还没有则向os申请并从树搜索,若返回span较大,分割为正好大小span,剩余放回free.
    • GC标记及回收都是对对象的span。
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值