注册 登录
  • 欢迎来到幻月小筑

深入理解jvm第三章总结

java学习日记 seal 15次浏览 0个评论

第三章—垃圾收集器和内存分配策略

一、对象存活判断算法

    1.引用计数法:在对象中添加一个引用计数器,当有一个地方引用对象,就将引用计数器加1,;当引用失效时,就将引用计数器减1,任何时候计数器为0的时候对象就不再使用

          引用计数法简单高效,但是有一个致命缺陷就是无法解决对象间循环引用的问题

    2.可达性分析法:通过一系列的GC roots的对象作为起点,从这些节点开始向下搜索,搜索走过的路线称为引用链,当一个对象没有任何引用链相连时,证明此对象不可用

    GC roots 的对象包括以下:

     虚拟机栈中引用的对象

     方法区中静态变量引用的对象

     方法区中常量引用的对象

    本地方法占中JNI引用的对象

3.4种引用

   强引用只的是类似(Object obj = new Object())的引用,只要强引用存在,垃圾回收器永远不会回收掉被引用的对象

   软引用

   用来描述一些有用但是并非必须的对象,这些对象在内存将要发生溢出异常时,才会将这些对象列进回收范围之内,如果本次内存回收还是不满足内存需要,则抛出内存溢出异常

弱引用

   也是用来描述非必须异常,但是比软引用强度更低,被弱引用关联的对象,只能存活到下一次垃圾收集发生之前

幽灵引用

  这种引用的唯一目的就是在这个对象被回收时,发出一个系统通知而已

4.finalize方法

   对于这个方法,书上说知道有这么个方法就行了,不建议使用,此方法可以让对象逃脱一次垃圾回收,仅限一次,对于那些非可达性并且已经执行过finalize方法的对象,只有被回收的命运了

二、垃圾回收算法

1.标记清除算法

     首先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。主要有两个不足:一是效率,二是空间问题,标记清除算法会产生大量不连续的内存碎片

2.copying算法

   它将内存分为容量大小相等的两块,每次只使用其中一块,当这一块内存使用完了,就将或者的对象复制到另一块上,再把已经使用过的内存空间一次清理掉

   不过这种算法代价太高,将内存缩小了一半

3.标记整理算法

  结合了标记清除算法和copying算法,标记过程仍然是与标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存

4.分代收集算法

   当前商业虚拟机的垃圾收集都采用分代收集算法,这种算法是根据对象存活周期的不同将内存划分为几块。一般分为新生代和年老代。新生代中每次垃圾收集都有大批对象死去,只有少量存活,因此采用复制算法。而年老代因为对象存活效率高,没有额外的空间对它进行担保,必须使用标记清除或者标记整理算法

5安全点

   线程中断标志,线程自动执行

三、垃圾收集器

1.Serial

   Serial是最基本,发展历史最悠久的收集器。这个收集器是一个单线程收集器,单线程并不仅仅是它只会使用一个cpu或者一条线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(Stop The World,这项工作是有虚拟机在后台自动发起和自动完成的,在用户不可见的情况下实现的)

   Serial是运行在Client模式下的默认新生代收集器,对于单线程环境,Serial相比于其他收集器来说是简单高效的

2.ParNew

   parnew 收集器其实就是Serial的多线程版本,除了使用多线程,别的和Serial都差不多,但是它确是在许多运行在Server模式下的虚拟机中首选的新生代收集器,其中一个与性能无关的原因是因为目前只有它能与CMS收集器配合工作。

3。Parallel Scavenge

   PS收集器是一个新生代收集器,也是采用复制算法,但是PS收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而PS收集器的目标是达到一个可控制的吞吐量。吞吐量是CPU运行用户代码的时间与CUP总消耗时间的比值

 

。。。。。未完待续

 


幻月小筑丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明深入理解jvm第三章总结
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到