转载

「每日五分钟,玩转JVM」:两种算法

前言

上篇文章,我们了解了GC 的相关概念,这篇文章我们通过两个算法来了解如何去确定 堆中的对象实例 哪些是我们需要去回收的 垃圾对象

引用计数算法

「每日五分钟,玩转JVM」:两种算法

引用计数法的原理很简单,就是在对象中维护一个计数器,当有一个对象引用它的时候,该计数器的值就会加一,当这个引用失效的时候,计数器的值就会减少一,当计数器的值为零的时候,就意味着这个对象是一个垃圾对象,需要被 GC 回收,这个算法是一个比较高效的算法,但是会存在一种对象循环引用导致内存泄露的问题,什么是循环引用呢?

「每日五分钟,玩转JVM」:两种算法

就像这样,对象 A 和对象 B 之间存在相互引用,但是除此之外,这两个对象再无引用,讲道理,这两个对象是属于我们定义的垃圾中的,但是由于计数器的值不为零,所以就无法被标记为垃圾,我们的 GC 也就无法去回收这两个对象,这两个对象会失去控制,长久的存在我们的对象中占用内存,造成内存的泄露。

可达性分析法

这个算法我一般理解为 落叶归根算法 (远离家乡 不甚唏嘘 幻化成秋夜 而我却像落叶归根 坠在你心间~),为什么这么说呢?这个算法的原理也很简单,就是维护一系列的『GC ROOT』的对象作为我们的根,从这些根搜索,走过的路径官方话叫做引用链(Reference Chain),当一个对象到根节点没有任何引用,就意味着这个对象是不可用的,也就是我们俗称的垃圾~

换个说法来理解很简单:长在树上的叶子是我们的可用对象,当叶子脱离了树枝,与树根之间没有任何联系的时候,就需要 落叶归根 ,被 GC 回收,也就是 落红不是无情物,化作春泥更护花 ~

「每日五分钟,玩转JVM」:两种算法

那么在我们的 JVM 中,可以被认为是 GC ROOTS的对象有以下几种:

  • 虚拟机栈中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中 JNI(Java Native Interface) 引用的对象

公众号

「每日五分钟,玩转JVM」:两种算法

原文  https://segmentfault.com/a/1190000022141032
正文到此结束
Loading...