上篇文章,咱们了解了GC 的相关概念,这篇文章咱们经过两个算法来了解如何去肯定堆中的对象实例哪些是咱们须要去回收的垃圾对象。算法
引用计数法的原理很简单,就是在对象中维护一个计数器,当有一个对象引用它的时候,该计数器的值就会加一,当这个引用失效的时候,计数器的值就会减小一,当计数器的值为零的时候,就意味着这个对象是一个垃圾对象,须要被 GC 回收,这个算法是一个比较高效的算法,可是会存在一种对象循环引用致使内存泄露的问题,什么是循环引用呢?3d
就像这样,对象 A 和对象 B 之间存在相互引用,可是除此以外,这两个对象再无引用,讲道理,这两个对象是属于咱们定义的垃圾中的,可是因为计数器的值不为零,因此就没法被标记为垃圾,咱们的 GC 也就没法去回收这两个对象,这两个对象会失去控制,长久的存在咱们的对象中占用内存,形成内存的泄露。cdn
这个算法我通常理解为落叶归根算法(远离家乡 不甚唏嘘 幻化成秋夜 而我却像落叶归根 坠在你心间~),为何这么说呢?这个算法的原理也很简单,就是维护一系列的『GC ROOT』的对象做为咱们的根,从这些根搜索,走过的路径官方话叫作引用链(Reference Chain),当一个对象到根节点没有任何引用,就意味着这个对象是不可用的,也就是咱们俗称的垃圾~对象
换个说法来理解很简单:长在树上的叶子是咱们的可用对象,当叶子脱离了树枝,与树根之间没有任何联系的时候,就须要落叶归根,被 GC 回收,也就是落红不是无情物,化做春泥更护花~blog
那么在咱们的 JVM 中,能够被认为是 GC ROOTS的对象有如下几种:内存