java虚拟机之垃圾回收器

         java中的垃圾回收器的三件事情:

    1. 哪些内存要回收。
    2. 什么时候回收。
    3. 如何回收。

        如何确定对象活着或者死去,即哪些内存需要回收,我们有很多的算法,其中之一是采用引用计数算法,设置对象的引用计数器,但是这样无法解决对象之间的相互循环引用的问题。第二种是根搜索算法,设置一些名为“GC Roots”的对象作为起点,开始向下搜索,当一个对象到GC roots没有路径相连(引用链)时,证明是不可用的,可以作为GC roots的对象包括:虚拟机栈中引用的对象,方法区的中类静态属性引用的对象,方法区中的常量引用的对象,本地方法栈中的引用对象。

java中的引用分四类:强,软,弱,虚。

即使对象不可达,也不是非死不可,可以自我拯救一次(仅一次),就是调用对象的finalize()方法,这个方法只会被调用一次,如果方法不吧自己关联引用链,即赋值给某个变量或对象的成员变量,第一次回放到一个F-Queue队列中,无调用,第二次就销毁了。

方法区(永久带)也是有垃圾回收的,但可以不要求有,因为回收的不多,效率低,不像堆一样。其主要回收废弃常量和无用的类。

     垃圾收集算法

  1. 清除----标记算法:主要缺点就是效率问题和产生不连续的内存碎片问题。
  2. 复制算法:空间分成两块或者更多,比如三块,一个较大的Eden空间和两个较小的Survivor空间,比例为8:1左右。缺点一是内存分割减小了,二是万一对象存活率高,复制开销大。
  3. 标记----整理算法:先标记,然后标记的都移动到一端,然后直接清理到端边界以外的内存。
  4. 分代收集算法,当前商业虚拟机采用,根据对象存活周期将内存分为好几块,如分为新生代和老年代,然后新生代会有大量对象死去,选用复制算法,老年代对象存活率高,用标记--清除或者标记--整理。

    垃圾收集器

  1. serial收集器:stop the world。
  2. ParNew收集器:Serial收集器的多线程版本
  3. Parallel Scavenge收集器:复制算法。
  4. Serial Old收集器:标记整理算法。
  5. Parallel Old收集器:标记整理算法。
  6. CMS收集器:(Concurrent Mark Sweep)基于标记清除算法:初始标记-并发标记-重新标记-并发清除。
  7. G1收集器:标记整理算法。显著改进一是不产生空间碎片,二是精确的控制停顿,即在M毫秒内消耗在垃圾回收上的时间不超过N毫秒。

    内存分配:

  1. 对象优先在Eden上分配
  2. 大对象直接进入老年代
  3. 长期存活的对象直接进入老年代
  4. 动态对象年龄判断
  5. 空间分配担保
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值