前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JVM垃圾收集详解

JVM垃圾收集详解

作者头像
Java学习录
发布于 2019-05-15 05:46:54
发布于 2019-05-15 05:46:54
4190
举报
文章被收录于专栏:Java学习录Java学习录

本文涉及:垃圾对象的判定、常见垃圾收集算法

哪些对象需要回收

判断对象是否需要回收的算法有引用计数法和可达性分析法

引用计数法

为每个对象标记一个引用数量,当这个对象被另外一个对象引用时它的引用数据就加一,当另外一个对象释放了对它的引用它的引用数量就减一。当它的引用变为0时意味着没有对象引用,就可以回收了

引用计数法存在的问题

  • 系统无时无刻不在进行引用的增加和修改,引用和去引用伴随着加减法,非常影响性能
  • 很难处理循环引用,例如下图右面三个对象互相持有对方的引用则无法处理

可达性分析

通过设置一个跟节点,如果从根节点出发没有任何路径到达一个对象,则标记这个对象为不可达对象,当一个对象被标记了2次不可达对象之后将面临回收

垃圾收集算法

标记清除法

首先标记所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象

缺点

  • 标记和清除的效率都不高
  • 标记清除后会产生大量的不连续空间

复制算法

将原有的内存空间分为两块。每次只使用其中一块,在垃圾回收时,将正在使用的内存空间的存活的对象全都复制到未使用的那块内存空间,然后清除正在使用的那块内存,再交换两个角色,完成垃圾回收

缺点

  • 空间浪费

标记压缩法

第一步标记阶段与标记清除法一样,标记所有需要回收的对象,接着把所有需要回收的对象全都压缩到内存的一端,之后再进行清理

分代收集

分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,然后根据不同域的特点选择不同的算法

  • 新生代因为每次垃圾回收都需要回收大量的对象,故使用复制算法
  • 老年代因为每次回收少量对象,使用标记整理对象

分区收集算法

分区算法则将整个堆空间划分为连续的不同小区间, 每个小区间独立使用, 独立回收. 这样做的好处是可以控制一次回收多少个小区间 , 根据目标停顿时间, 每次合理地回收若干个小区间(而不是整个堆), 从而减少一次 GC 所产生的停顿

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

本文分享自 Java学习录 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM:垃圾收集策略与算法
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事是确定这些对象之中哪些还"存活"着,哪些已经"死去"了。
HLee
2021/02/24
3650
JVM:垃圾收集策略与算法
解析JVM之垃圾收集篇,超详细!
我们在进行垃圾回收(Garbage Collection,简称GC)之前肯定要先判断哪些是垃圾。
程序员的时光001
2020/12/14
3380
解析JVM之垃圾收集篇,超详细!
JVM笔记-垃圾收集算法与垃圾收集器
引用计数法(Reference Counting):为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。当有地方引用它时,计数器加一;引用失效时减一。当某个对象的引用计数为零时,说明该对象已死亡,便可以被回收了。
WriteOnRead
2020/02/24
5250
垃圾收集算法 Krains 2020-08-06
每个对象保存一个整型的引用计数器,假设有一个对象A,如果别的对象引用了A,就让A对象的引用计数器加1,如果引用失效了,计数器减1,当计数器为0的时候,该对象就是垃圾。
Krains
2020/08/10
2950
垃圾收集算法  Krains 2020-08-06
JVM 八股之首:三大垃圾收集算法
前文介绍过,基于分代收集理论的指导,我们才可以针对堆中不同的区域,设计出不同的垃圾收集算法,主要有以下三种:
飞天小牛肉
2022/05/24
7220
JVM 八股之首:三大垃圾收集算法
JVM之垃圾回收相关算法
当p的指针断开的时候,内部的引用形成一个循环,这就是循环引用,从而造成内存泄漏
冬天vs不冷
2025/01/20
640
JVM之垃圾回收相关算法
深挖Jvm垃圾收集
垃圾收集(Garbage Collection,GC),它的任务是解决以下 3 件问题:
李红
2019/07/06
3160
Java 虚拟机垃圾收集机制详解
之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了
BUG弄潮儿
2020/12/17
2270
Java 虚拟机垃圾收集机制详解
vivo 校招:说一说 JVM 垃圾回收算法有哪些?分别用在哪些垃圾收集器?
最近 vivo 校招薪资开奖了,想必互联网公司给的不算多,有的同学达到 vivo offer 后直接拒了。
码哥字节
2024/11/23
890
vivo 校招:说一说 JVM 垃圾回收算法有哪些?分别用在哪些垃圾收集器?
JVM学习笔记——垃圾收集器与内存分配策略(1)
上一篇文章介绍了java运行时内存的各个区域,其中虚拟机栈,程序计数器,本地方法栈三个区域随线程而生,随线程而灭。栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈与入栈的操作,每一个栈帧分配多少内存基本是类结构确定下来就已知的。因此,这几个区域的内存回收都具有确定性,在这几个区域不必过多的考虑回收的问题,因为方法结束或者线程结束时,内存自然也跟着回收了。 而java堆与方法区不一样,一个接口的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存可能不一样,只有在程序处于运行期间才能知道会创建哪些对象。这部分的内存分配与回收都是动态的,垃圾收集器所关心的也是这部分内存。
用户1665735
2019/02/19
4080
Java垃圾回收机制
在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。
用户2909867
2018/08/22
9980
13道关于JVM垃圾收集器的面试题,哪些你还不会?
13道关于JVM垃圾收集器的面试题,哪些你还不会?
Java架构师必看
2021/05/14
7500
13道关于JVM垃圾收集器的面试题,哪些你还不会?
JVM (标记-清除算法、复制算法、标记-整理算法、分代收集算法、分区算法)
在Java堆中存放着所有Java的对象实例 ,在GC执行垃圾收回之前,JVM需要标识出来哪些是对象已经不被引用(垃圾),哪些被引用,而JVM有两种垃圾标识对象是否存活,分别是:引用计数算法和可达性分析算法。
逍遥壮士
2021/07/29
2.4K0
深入理解JVM垃圾收集机制
程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行。
李红
2019/05/29
3770
jvm5:14-15 垃圾回收概述+算法
知道哪几种垃圾收集器,各自优缺点,重点讲下cms和g1,包括原理、流程、优缺点,垃圾回收算法的实现原理
用户10832809
2025/02/25
780
垃圾收集策略与算法
程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
黑洞代码
2021/04/23
3480
详解JVM之垃圾回收机制和常用算法
垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。
架构狂人
2023/08/16
2470
详解JVM之垃圾回收机制和常用算法
深入理解JVM(三)——垃圾收集策略详解
Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。 这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。 这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题。 程序计数器、Java虚拟机栈、本地方法栈都是线程私有的,也就是每条线程都拥有这三块区域,而且会随着线
大闲人柴毛毛
2018/03/09
6840
深入理解 JVM 之——垃圾回收与内存分配策略
内存回收的时机是由垃圾回收器(Garbage Collector)来决定的,而垃圾回收器的具体策略和时机会根据不同的实现而有所差异。一般情况下,以下几种情况会触发内存回收:
浪漫主义狗
2023/09/06
7840
深入理解 JVM 之——垃圾回收与内存分配策略
深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解
说起垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释放垃圾占用的空间,这一切都交给了JVM来处理。本文主要解答三个问题:
全栈程序员站长
2022/08/27
6920
深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解
推荐阅读
相关推荐
JVM:垃圾收集策略与算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文