专栏首页Vi的技术博客「每日五分钟,玩转JVM」:两种算法

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

前言

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

引用计数算法

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

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

可达性分析法

这个算法我一般理解为落叶归根算法

),为什么这么说呢?这个算法的原理也很简单,就是维护一系列的『GC ROOT』的对象作为我们的根,从这些根搜索,走过的路径官方话叫做引用链(Reference Chain),当一个对象到根节点没有任何引用,就意味着这个对象是不可用的,也就是我们俗称的垃圾~

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

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

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

后记

最近笔者在更新自己的 GTD 系统,说来惭愧,玩了一年了才算是有所领悟,年前会出一篇超长的 GTD 的个人经验和实践过程中遇到的问题,从工具到遇到的问题都会有,敬请期待~

本文分享自微信公众号 - Vi的技术博客(viyoungblog),作者:ViYoung

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「给产品经理讲JVM」:垃圾收集算法

    纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了。从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标...

    Vi的技术博客
  • 「Offer收割机之JVM」:引用是个什么鬼

    这两天,广州的天气又开始热了起来,又到了小动物交配的季节,啊呸,又到了一个收割 offer 的季节。年底将至,又到了面试的高峰期,JVM 作为Java 程序员面...

    Vi的技术博客
  • Spring Boot 2.x(六):优雅的异常处理

    异常的处理在我们的日常开发中是一个绕不过去的坎,在Spring Boot 项目中如何优雅的去处理异常,正是我们这一节课需要研究的方向。

    Vi的技术博客
  • 《深入理解 Java 虚拟机》学习 -- 垃圾回收算法

    给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加 1;当引用失效时,计数器就减 1;任何时刻计数器都为 0 的对象就是不可能再被使用的。

    希希里之海
  • 发布与逸出

    SuperHeroes
  • JVM 垃圾回收机制

    首先JVM的内存结构包括五大区域: 程序计数器、虚拟机栈、本地方法栈、方法区、堆区。其中程序计数器、虚拟机栈和本地方法栈3个区域随线程启动与销毁, 因此这几个区...

    烟草的香味
  • 虚拟机篇 之「垃圾收集与内存分配策略」

    在 Java 对象被回收之前,首先需要判断该对象是否已经过期或者死亡?常见的判断一个对象是否过期的算法主要有两种,分别为:

    CG国斌
  • 编程中的死亡对象

      在之前的 Java内存区域文章中已经知道几乎所有Java对象实例都存放在堆中,GC对堆进行回收之前先是判断哪些对象已经“死亡”。那么问题来了,怎么样确定一个...

    GreizLiao
  • JVM的GC

    将内存分为大小相等两块, 每次只用一块, 当这一块用完了, 就将还存活的对象复制到另一块内存上, 然后把已经使用的左边的内存空间一次性整理

    CoffeeLand
  • iOS的内存管理

    王大锤

扫码关注云+社区

领取腾讯云代金券