xl_echo编辑整理。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!算法
如下内容摘抄自《深刻理解Java虚拟机JVM高级特性与最佳实践 第2版220》,博主彻底尊重书籍原创,只是学习笔记摘抄部分,因为不是原创,不支持转载。若有侵权请联系博主(微信号:t2421499075)。编程
Java是一门面向对象的编程语言,在程序运行过程当中每时每刻都有对象被建立,咱们在写代码的时候,能够看到建立对象仅仅只是new关键字而已,而虚拟机中建立确实一个比较复杂的过程。微信
对象是否还“存活”Java程序运行产生了不少对象实例,垃圾收集器在对堆进行回收前都会判断对象是否还“存活”编程语言
给对象中添加一个引用计数器,每当有一个地方引用它的时候,计数器值就加1,当引用失效时计数器值就减1.大部分的结果都是当计数器统计完成技术值为0,那么该对象就是已经能够被回收。(它不能解决循环引用的问题)学习
该算法的基本思路就是经过可达性分析来断定对象是否存活的。这个算法的基本思路就是经过一系列的成为“GC Roots”的对象做为起点,从这些节点开始向下搜索搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链项链时,证实对象是能够回收的对象
最基础的收集算法是标记-清除算法,如同它的名字同样,算法为标记和清除两个阶段:首先标记处全部须要回收的对象,在标记完成后统一回收全部被标记的对象。不少其余的算法都是基于标记清除这种算法的思想,因此说它是最基础的算法blog
为了解决效率问题,一种称为复制的收集算法出现了。它将内存分为两块对等大小,每次使用一块,当这一块使用完成,就将还存活的对象复制到另外一块内存,一次性清除使用完成的那一块。它的优势就是实现简单,运行高效。图片
复制收集算法在对象存活率较高时就要进行较多的复制操做,效率将会下降。标记过程与标记-清除算法同样,但后续步骤不是直接对可回收对象进行清理,而是让全部存活的对象都向一端移动,而后直接清理掉端边界之外的内存内存
这种算法实际上是将内存划分为不一样的几块,通常是把Java堆分为新生代和老年代,根据不一样的年代的特色选用上面的适合的算法。虚拟机