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

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

作者头像
山禾说
发布于 2019-11-21 03:36:50
发布于 2019-11-21 03:36:50
3590
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
两种垃圾标记算法
Get
2024/03/20
720
【JVM进阶之路】五:垃圾回收概述和对象回收判定
垃圾收集(Garbage Collection,简称GC)简单说,就是要干三件事:
三分恶
2021/04/01
3880
【JVM进阶之路】五:垃圾回收概述和对象回收判定
如果这题都不会面试官还会继续问我 JVM 嘛:如何判断对象是否可回收
回顾下 Java 内存运行时区域,程序计数器、虚拟机栈、本地方法栈 这 3 个区域是线程私有的,随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。
飞天小牛肉
2022/04/11
3940
如果这题都不会面试官还会继续问我 JVM 嘛:如何判断对象是否可回收
JVM垃圾判断
其中程序计数器、虚拟机栈和本地方法栈3个区域随线程启动与销毁, 因此这几个区域的内存分配和回收都具有确定性,不需要过多考虑回收的问题。而Java堆区和方法区则不一样,这部分内存的分配和回收是动态的,正是垃圾回收需要关注的部分。
gang_luo
2020/08/13
2460
JVM垃圾判断
JVM 系列(3) —— 垃圾回收算法
在 Java 对对象进行回收之前,需要判断哪些对象已死,哪些对象存活,常用的判断方法有两种: 引用计数法和可达性分析法
求和小熊猫
2020/12/22
3320
JVM 系列(3) —— 垃圾回收算法
JVM GC算法
在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。 JVM垃圾判定算法 常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。 引用计数算法(Reference Counting) 引用计数算法是通过判断对象的引用数量来决定对象是否可以被回收。 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 优点:简单,高效,现在的objective-c用的就是这种算法。 缺点:很难处理循
武培轩
2018/04/18
1.1K0
JVM GC算法
深入理解JVM(③)判断对象是否还健在?
因为Java对象主要存放在Java堆里,所以垃圾收集器(Garbage Collection)在对Java堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(不被引用了)。
纪莫
2020/06/07
3410
必知必会JVM垃圾回收——对象搜索算法与回收算法
垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作。但是这并不是说程序员不需要了解GC。GC只是Java编程中一项自动化工具,任何一个工具都有它适用的范围,当超出它的范围的时候,可能它将不是那么自动,而是需要人工去了解与适应地适用。
Zack说码
2019/08/05
3720
必知必会JVM垃圾回收——对象搜索算法与回收算法
六、jvm之如何判断对象已死?
在堆里面几乎存放中Java程序运行所动态生成的所有对象,垃圾回收器在对堆进行回收前,第一件事情就是要确定这些对象之中还有哪些存活,哪些已经死去(即不可能再被任何途径使用的对象)。判断的方式有两种:引用计数算法和可达性算法。 目前虚拟机基本都是采用 可达性算法,为什么不采用引用计数算法呢?下面就说说引用计数法是如何统计所有对象的引用计数的,再对比分析可达性算法是如何解决引用技术算法的不足。先简单说说这两个算法:
栋先生
2018/09/29
3450
六、jvm之如何判断对象已死?
什么样的对象需要被 GC ?
上一篇文章 JVM 基本介绍 我们了解了一些基本的 JVM 知识,本篇开始逐步学习垃圾回收,我们都知道既然叫垃圾回收,那回收的就应该是垃圾,可是我们怎么知道哪些对象是垃圾呢? 哪些对象需要被回收? 什么时候需要回收呢?
周三不加班
2019/06/03
7940
【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )
空间 ; 老年代又称为永生代 , 只要程序没有 OOM 崩溃 , 这些 对象都是永生的 ; 比较大的对象直接放入老年代 ;
韩曙亮
2023/03/29
4870
JVM之JVM初探
JVM的类加载器为ClassLoader采用双亲委派模型机制进行加载类。 双亲委派模型机制: 根据父子关系一直往顶层找是否被其他父级parent类加载器加载过,如果找到加载过,返回;如果没有找到,在返回一个一个查找是否有加载的权限,如果有就加载;如果这个时候所有的父级parent类加载器都没有加载过而且没有权限加载,那么自己去加载。
北洋
2021/12/14
5200
JVM之JVM初探
深入了解JVM垃圾收集器
程序计数器、JVM栈、本地方法栈这三个内存区域和线程是一一对应的,并且每一个线程的这三个区域相互独立互不干扰。他们都随着线程的产生而产生,线程的灭亡而灭亡。JVM栈和本地方法栈中的栈帧都随着方法的加载而入栈,随着方法的结束而出栈。 栈帧的大小是在程序员写类的时候就确定下来的。因此这三种区域的内存大小都具备确定性,当方法结束或线程结束后,这些内存空间就会自动被回收掉,所以JVM无需考虑这些区域的内存回收问题。 堆内存和方法区的内存分配和回收就不一样了,因为一个接口中的多个实现类所需要的内存可能不一样,并且一个
大闲人柴毛毛
2018/03/09
6680
GC 的两种判定方法
【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)
疯狂的KK
2023/07/09
4690
GC 的两种判定方法
JVM--对象回收
Java运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。这里面程序计数器、虚拟机栈和本地方法栈是线程私有的,当线程结束或者方法退出时其内存自然会被回收。所以Java的垃圾回收机制主要关注的是两部分:Java堆和方法区。JVM规范并没有强制要求对方法区进行GC,其实方法区保存的都是类信息、静态变量、常量等,并不太需要GC,所以GC主要还是关注Java堆。
SuperHeroes
2019/03/12
4590
【GC系列】JVM垃圾定位及垃圾回收算法浅析
在某一内存空间中,Java程序制造了很多对象被引用,有的对象还引用别的对象,中途有对象不被需要了就没有指向他的引用了,这些没有引用指向的东西就是垃圾。
行百里er
2020/12/02
7270
【GC系列】JVM垃圾定位及垃圾回收算法浅析
jvm垃圾回收算法有哪些_java垃圾回收算法几种
引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。
全栈程序员站长
2022/11/17
6260
jvm垃圾回收算法有哪些_java垃圾回收算法几种
Java虚拟机:如何判定哪些对象可回收?
在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经“死去”的对象(即不可能再被任何途径使用的对象),释放内存。垃圾收集器在对堆内存进行回收前,首先要做的第一件事就是确定这些对象中哪些还存活着,哪些已经死去。Java虚拟机是如何判断对象是否可以被回收的呢?
烂猪皮
2021/04/23
4100
Java虚拟机:如何判定哪些对象可回收?
JVM(三)对象的生死判定和算法详解
导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘“拯救”一个将死对象?判断对象的生死存活都有那些算法?本文带你一起找到这些答案。
磊哥
2019/01/28
5351
JVM(三)对象的生死判定和算法详解
Jvm对象回收算法-JVM(九)
这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。
用户9919783
2023/09/05
1350
Jvm对象回收算法-JVM(九)
推荐阅读
相关推荐
两种垃圾标记算法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文