Java垃圾收集

1. Java的垃圾收集算法:

  1.1 什么样的对象应该被清除?

  引用计数算法:

  给对象添加一个引用计数器,每个引用它的地方,计数器值加一,引用断开时,计数器值减一,当计数器值为0时,这个对象就是不可能再被     使用的,可以被清除;

  引用计数算法简单,判定效率高,但是无法解决对象之间相互循环引用的问题;

  可达性分析算法:

  通过一系列GC Roots的对象作为起始点,从这些节点开始向下搜索,若对象与GC Roots没有引用链相连,则该对象可以被回收;

  

  1.2 对象的四种引用强度:

 有些对象在内存空间足够情况下,我们希望能留在内存空间;内存空间紧张时,就释放它们;Java对引用的概念做了扩充,将引用分为四     种:

  强引用:只要强引用存在,垃圾收集器不会回收被引用的对象;

  软引用:在系统即将发生内存溢出时,将这些对象列进回收范围第二次回收;

  弱引用:它的强度比软引用更弱一些,被弱引用关联到的对象只能生存到下一次垃圾回收发生之前,当垃圾收集器工作时,无论当前内存是   否足够,都会回收掉只被弱引用关联的对象;

  虚引用:一个对象是否有虚引用,完全不对其生存时间构成影响,也无法通过一个虚引用来获得对象实例,为对象设置虚引用的唯一目的是   在对象被回收时收到一个系统通知;

  
  
  标记-清除算法:算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收被标记的对象;是最基础的收集     算法,它的不足主要有两点:1. 效率问题;2. 标记-清除之后会产生大量不连续的内存碎片,碎片过多会导致之后程序运行中需要分配大对   象时,无法找到足够的连续内存而触发另一次垃圾收集动作;
  复制算法:将内存分为一块大的Eden空间和两块小的Survivor空间,每次使用Eden和其中一块Survivor,当回收时,将Eden和Survivor中   活着的对象复制到另一块Survivor空间中,最后清理掉Eden和用过的Survivor;
  标记-整理算法:标记过程与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让存活对象向一端移动;
  分代收集算法:根据新生代和老年代不同的特点选择不同的收集算法;

 2. 垃圾收集器:
 2.1 安全点与安全区域:
  程序只有运行到安全点上才能进行GC;而安全区域是指在一段代码片段中,引用关系不会发生变化,在这个区域的任何地方开始GC都是安   全的;
  2.2 Serial收集器:
  最基本的收集器,用于新生代垃圾收集,采用复制算法,单线程、简单、高效;
  2.3 ParNew收集器:
  Serial收集器的多线程版本,采用复制算法,可以配合CMS收集器使用;
  2.4 Parallel Scavenge收集器:
  特点:用于新生代,采用复制算法,吞吐量优先(适用于后台运算不需要太多交互的任务),自适应调节策略;
  2.5 Serial Old收集器:
  用于老年代,采用标记整理算法;
  2.6 Parallel Old收集器:
  Serial Old收集器的多线程版本,搭配Parallel Scavenge收集器;
  2.7 CMS收集器:
  以最短回收停顿时间为目标的收集器,用于老年代,注重服务的响应速度,希望系统停顿时间最短;但是它不是完美的,CMS收集器对         CPU资源敏感,CMS收集器无法处理浮动垃圾,CMS收集器基于标记-清除算法,会产生空间碎片;
  2.8 G1收集器:
  特点:并行与并发,分代收集,空间整合,可预测的停顿;

 3. 内存分配与回收策略:
 3.1 对象优先分配在Eden区:当Eden区没有足够空间时,发起一次Minor GC(指发生在新生代的垃圾收集动作,Minor GC非常频繁,回   收速度也很快)
 3.2 大对象直接进入老年代:
 3.3 长期存活的对象将晋升到老年代:对象在Survivor区“熬过”一次Minor GC,年龄就增加一岁,年龄增加到一定程度(默认为15岁)     就会晋升到老年代;
  3.4 动态对象年龄判定:
 3.5 空间分配担保:老年代最大可用连续空间大于新生代对象总空间时,Minor GC才确保安全。否则是有风险的,当大量对象在Minor GC   下存活时,老年代需要进行分配担保,Survivor无法容纳的对象将放入老年代,老年代要进行这样的担保,前提是老年代有能容纳这些对象   的剩余空间,若不成立,虚拟机检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小;若大于,则可以尝试一次Minor   GC,若小于或设置不允许冒险,虚拟机进行Full GC(指发生在老年代的GC,通常伴有至少一次的Minor GC);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值