GC算法

1.GC概念

GC 是指在程序运行过程中对一些没用了的对象,这些对象占据内存空间, 如果不及时回收会导致内存空间占用完,导致内存溢出, 相比c和c++ 是由代码主动控制回收,java 在后台有一个垃圾回收线程在不停扫描回收。java 中GC的对象是堆空间和永久区

2.GC算法

  • 引用计数
    只要这个对象用有一个引用 , 则在对象上标记+1 ,失去引用 -1 。当为引用为0 , 则释放空间 。
    引用计数法的问题 :
    a.引用和去引用伴随加法和减法,影响性能
    b.很难处理循环引用(根本问题)
  • 标记-清除 :
    从根节点出发, 所有可达的对象标记为存活对象, 所有不可达的标记为垃圾对象, 然后清除阶段将标记为垃圾的对象清除完毕
    标记-清除.png
  • 标记-压缩:
    与标记清除不同的是, 将对象标记后, 将存活对象移动到一端 ,移动完成之后, 清除界限外的空间
    标记压缩.png
  • 复制算法 :将使用的内存分为两块, 每次只能使用其中1块 , 当进行垃圾回收时将存活对象复制到另一块去, 然后清除正在使用的内存块, 交换角色, 缺点空间浪费,不适用大对象空间回收。
    复制算法.png

eden 采用标记清除算法,将还存活的对象放入幸存区, 当大对象塞不下时直接放入老年代,幸存区经过回收还存在的对象将进入老年代


图片.png

分代思想 : 依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。根据不同代的特点,选取合适的收集算法

  • 少量对象存活,适合复制算法
  • 大量对象存活,适合标记清理或者标记压缩

可触及性 : 从根节点出发能触及到这个对象
可复活的 : 在finalize()方法中可能复活该对象。
不可触及的 : 不可触及对象不可能复活, 可以回收


可触及性.png

避免使用finalize() 方法,因为gc是不确定的,操作不慎可能导致错误。

Stop-The-World :是指java中一种全局暂停的现象 ,多半是由GC 引起 ,引起原因是发生GC时要求其他线程全部停止, 等GC完成后再重新工作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、垃圾收集的意义  相对于C++来说,Java预言显著的特点就是引入了垃圾回收机制,它使得Java程序员在编写程...
    SunnyMore阅读 2,181评论 0 50
  • 声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87 垃圾收...
    唐影若凡阅读 1,077评论 1 6
  • –引用计数法 是一个老牌垃圾回收算法,通过引用计算来标记,判断一个对象是不是垃圾,是不是要回收。 基本思想 : 为...
    _BK_徐静阅读 1,214评论 0 2
  • 上篇我们介绍了Java运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法3个区域随线程而生,随线程而灭;栈中...
    泰迪的bagwell阅读 744评论 0 0
  • 谁都会有烦恼,每天都有烦恼,最重要的是要学会与烦恼相处。当你烦恼的时候,只要记住这两句话:烦恼天天有,不捡自然无!...
    罗掌柜real阅读 125评论 0 0