前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解java虚拟机笔记(二)-垃圾回收

深入理解java虚拟机笔记(二)-垃圾回收

作者头像
Java帮帮
发布2018-03-15 15:59:17
6410
发布2018-03-15 15:59:17
举报

1. 前言

作为一种高级语言,比起c和c++来,很进步的一点就是垃圾回收机制。这省去来了我们很多的工作,不过,我们仍然需要了解垃圾回收,这对我们的成长很有帮助。

2. 引用计数法

引用计数法在很多高级语言都有,如PythonJava也不例外。对象内部维护有一个被其他对象引用的引用计数,当这个引用计数为0的时候,表示对象可以被回收。

引用计数法存在一个问题,就是循环引用,加入a引用b,b同时也引用a,那么就存在ab的引用计数都不为0的情况。

3. 可达性分析算法

ps:图片来自网络

从图中我们可以很明显的看出,一个对象的根节点,不是gc root的话,就可以被回收。

4. 引用类型

java中有四种引用类型,默认是强引用类型:(下面都是说引用还在的情况下)

  • 强引用 宁愿crash,也不回收
  • 弱引用 内存不够用,就回收
  • 软引用 垃圾回收器,扫描到 就回收
  • 虚引用 随时回收

5. 回收方法区(永久代)

主要回收两部分内容:废弃常亮和无用的类

  • 废弃常量 没有被引用时,就会被清楚
  • 无用的类,要满足一下三个条件
    • 所有的类实例都被回收
    • 该类的classloader 被回收
    • 该类对应的class对象没有在任何地方被引用,也没有通过反射访问类的方法

6. 垃圾收集算法

  • 标记-清除
  • 复制
  • 标记-回收
  • 分代
6.1 标记-清除

首先标记需要回收的对象,然后清除需要回收的对象。

缺点:

  • 标记 清除两个过程效率都不高
  • 存在大量的内存碎片
6.2 复制算法

将内存分为两块,每次都使用其中一块,当这一块用完了,就将存活的对象复制到另一块,然后清除可以被回收的对象。

6.3 标记-整理

先标记可以被回收的对象,然后,让存活的对象向一端移动,最后直接清理掉另一端的内存。

6.4 分代收集算法

将内存根据生命周期分为几种,一般为新生代和老生代,然后根据特性,选择不同的回收算法

7. 内存分配

先来两个GC的概念:

  • 新生代GC Minor GC 指发生在新生代的垃圾收集动作,因为java对象大多具备自生夕灭的特征,所以minor gc非常频繁,回收速度也比较快
  • 老生代GC Major GC/Full GC 指老生代gc,出现了major gc,经常会伴随至少一次minor gc,major gc的速度一般会比minor gc慢10倍以上

  • 对象优先在新生代eden区分配
  • 长期存活的对象直接进入老生代,当对象度过一次minor gc,岁数+1,当过了一定值的时候,就进入老生代,
  • 动态对象年龄判断,如果survivor中相同年龄的对象的大小达到总大小的一半,年龄大于或等于这个年龄的对象直接进入老生代
  • 空间分配担保
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 引用计数法
  • 3. 可达性分析算法
  • 4. 引用类型
  • 5. 回收方法区(永久代)
  • 6. 垃圾收集算法
    • 6.1 标记-清除
      • 6.2 复制算法
        • 6.3 标记-整理
          • 6.4 分代收集算法
          • 7. 内存分配
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档