前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「每日五分钟,玩转JVM」:两种算法

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

作者头像
山禾说
发布2019-11-21 11:36:50
3270
发布2019-11-21 11:36:50
举报
文章被收录于专栏:Vi的技术博客Vi的技术博客

前言

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

引用计数算法

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

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

可达性分析法

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

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

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

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

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

后记

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Vi的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 引用计数算法
  • 可达性分析法
  • 后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档