Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >垃圾回收器的基本原理

垃圾回收器的基本原理

原创
作者头像
疯狂的KK
发布于 2023-07-13 09:16:16
发布于 2023-07-13 09:16:16
2870
举报
文章被收录于专栏:Java项目实战Java项目实战

垃圾回收器的基本原理

推荐阅读

【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)

腾讯云玩转Stable Diffusion 模型-腾讯云开发者社区-腾讯云 (tencent.com)

垃圾回收器(Garbage Collector)是Java虚拟机(JVM)中的组件,负责自动管理动态分配的内存,回收不再被程序使用的内存空间,从而避免内存泄漏和内存溢出的问题。垃圾回收器的基本原理包括垃圾识别和垃圾回收两个步骤。

垃圾识别

垃圾回收器通过标记-清除算法(Mark and Sweep)来识别哪些对象是垃圾。该算法的基本思想是,从根对象(如栈帧中的局部变量和静态变量)出发,递归地遍历所有可达的对象,并将其标记为“活动对象”。未标记的对象则被认为是垃圾,可以被回收。

在并发垃圾回收的情况下,可能会存在对象引用关系的动态变化,为了解决这个问题,通常采用可达性分析(Reachability Analysis)来实现垃圾识别。可达性分析基于程序栈和程序计数器的状态,确定对象之间的引用关系,将不可达的对象标记为垃圾。

垃圾回收

垃圾回收是指清理和回收被标记为垃圾的对象的过程。垃圾回收器会根据一定的策略,回收内存中的垃圾,并将空闲的内存空间合并形成连续的内存块,以供后续的对象分配使用。

常见的垃圾回收算法有标记-清除算法、复制算法、标记-整理算法和分代收集算法等。其中,标记-清除算法是最基本的垃圾回收算法,但它的效率较低,会产生内存碎片。为了解决这个问题,复制算法将内存分成两个区域,分别用作对象的分配和回收。标记-整理算法则是在标记-清除算法的基础上,将存活的对象移到内存的一端,从而整理出连续的空闲内存区域。

垃圾回收器的实现

垃圾回收器有两种主要的实现方式:串行垃圾回收器和并行垃圾回收器。

串行垃圾回收器(Serial Garbage Collector)是最简单的垃圾回收器,它会与应用程序的执行交替进行。在垃圾回收时,应用程序的执行会暂停,只有垃圾回收器在运行。这种垃圾回收器适用于单核处理器的环境。

并行垃圾回收器(Parallel Garbage Collector)利用多个线程来加速垃圾回收的过程。在垃圾回收时,多个垃圾回收线程会并发地扫描和回收内存,同时应用程序的执行也会继续进行。这种垃圾回收器适用于多核处理器的环境,可以充分利用多核处理器的计算能力,提高垃圾回收的效率。

垃圾回收器的回收时机

垃圾回收器不能及时回收内存,因为其回收时机是由Java虚拟机来决定的。Java虚拟机会根据一定的策略来判断何时触发垃圾回收,常见的触发条件包括:

  1. 当内存达到一定的阈值时,触发垃圾回收。Java虚拟机会根据内存的使用情况,设置一个阈值(如堆内存使用的百分比),当内存使用超过这个阈值时,就会触发垃圾回收。
  2. 当对象分配速度超过垃圾回收速度时,触发垃圾回收。如果应用程序频繁地分配内存,而垃圾回收的速度无法跟上分配的速度,就会导致内存的使用越来越高。为了避免内存溢出,Java虚拟机会在这种情况下触发垃圾回收。
  3. 当系统空闲时,触发垃圾回收。如果系统处于空闲状态,没有其他重要的任务需要执行,Java虚拟机会利用这个时间窗口来进行垃圾回收,以尽可能地回收内存。
  4. 调用System.gc()方法手动触发垃圾回收。虽然调用该方法不能保证立即触发垃圾回收,但可以向Java虚拟机发送一个建议,在合适的时机进行垃圾回收。

主动通知虚拟机进行垃圾回收

除了上述的垃圾回收器的回收时机,还可以通过一些手段主动通知虚拟机进行垃圾回收。

  1. 调用System.gc()方法。尽管这个方法只是向虚拟机发送一个垃圾回收建议,并不能保证立即触发垃圾回收,但是在某些情况下,虚拟机会根据建议来进行相应的操作。
  2. 调用Runtime.getRuntime().runFinalization()方法。这个方法会强制虚拟机在适当的时候调用那些被对象的finalize()方法声明的清理操作。
  3. 使用对象的WeakReference或SoftReference。弱引用(Weak Reference)和软引用(Soft Reference)是Java中用于管理内存的引用类型。通过使用这些引用类型,可以在内存不足时,让虚拟机主动回收被引用的对象。
  4. 调整垃圾回收器的相关参数。可以通过调整垃圾回收器的参数,以控制垃圾回收的时机和行为。例如,通过设置-Xmx参数来调整堆的大小,通过设置-XX:+UseConcMarkSweepGC参数来选择使用并发垃圾回收器。

需要注意的是,尽管可以通过这些手段来主动通知虚拟机进行垃圾回收,但并不能保证立即回收内存。垃圾回收的具体时机还是由虚拟机根据内部策略来决定。因此,在编写Java程序时,应该尽量避免过度依赖垃圾回收机制,合理管理对象的生命周期,以提高程序的性能和稳定性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM之垃圾回收相关算法
当p的指针断开的时候,内部的引用形成一个循环,这就是循环引用,从而造成内存泄漏
冬天vs不冷
2025/01/20
780
JVM之垃圾回收相关算法
java垃圾回收机制GC(Garbage Collection)-Java快速进阶教程
Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C、C++程序员需面对头疼的内存管理的问题。这是因为在Java虚拟机中,存在自动内存管理和垃圾清除机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。有了垃圾回收机制程序员不需要再关注什么时候释放内存,释放内存这件事儿完全由GC做了,对程序员来说是透明的。尽管如此,作为一名程序员很有必要理解垃圾回收GC(Garbage Collection)是如何工作的。垃圾收集器(Garbage Collector)的本质,就是跟踪所有被引用到的对象,整理不再被引用的对象,回收相应的内存。
jack.yang
2025/04/05
1400
java垃圾回收机制GC(Garbage Collection)-Java快速进阶教程
垃圾回收器算法
![](https://img-blog.csdnimg.cn/img_convert/09570fc1add1736d472f7705fe5fcba2.png#align=left&display=inline&height=548&margin=[object Object]&originHeight=548&originWidth=739&size=0&status=done&style=none&width=739)
编程之心
2021/07/14
7630
垃圾回收器算法
浅析垃圾回收
Java虚拟机的自动内存管理使开发人员不必手动回收内存,而是将其自动交给垃圾回收器来自动回收。然而,由于自动机制的限制,垃圾回收无法像手动回收那样精确高效。此外,垃圾回收的实现过程还可能产生一些问题。今天,我们简单地探讨一下垃圾回收的概念。
架构狂人
2023/08/16
2070
浅析垃圾回收
jvm入门6:16-17垃圾回收器
在默认情况下,通过system.gc()或者runtime.getRuntime().gc()的调用,会显示触发full gc,同时,对老年代和新生代进行回收,尝试释放被丢弃对象所占用的内存。
用户10832809
2025/02/25
1340
聊聊Java 中的经典垃圾回收器
按线程数分,可以分为串行垃圾回收器和并行垃圾回收器;按照工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器;按碎片处理方式可分为压缩式垃圾回收器和非压缩式垃圾回收器;而按工作的内存区间,又可分为新生代垃圾回收器和老年代垃圾回收器。本文就基于工作的内存区间划分,来介绍七种经典的垃圾回收器,下图是它们的工作区间以及搭配方式。
烂猪皮
2023/09/04
2040
聊聊Java 中的经典垃圾回收器
CMS(Concurrent Mark-Sweep)垃圾回收器
在现代Java应用中,垃圾回收(Garbage Collection, GC)是性能优化的关键之一。它自动管理内存,避免内存泄漏和手动管理的复杂性。CMS(Concurrent Mark-Sweep)是一种低延迟的垃圾回收器,设计用于减少应用程序停顿时间。
九转成圣
2024/08/05
1480
java — 垃圾回收
1. 垃圾回收的意义   在java中,当没有对象指向原先分配给某个对象的内存的时候,这片内存就变成了垃圾,JVM的一个系统级线程就会自动释放这个内存块,垃圾回收意味着程序不再需要的对象是“无用的信息”,这些信息会被丢弃。当一个对象不再被引用的时候,内存回收它所占用的空间,以便将空间用来存放后续的新对象。   除了①释放没用的对象,垃圾回收还可以②清除内存记忆碎片,由于创建对象和垃圾回收期释放丢弃对象所占的内存空间,内存会出现碎片,碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的对内存移动到堆
Mister24
2018/05/14
1.4K0
java1.8垃圾回收机制_JAVA垃圾回收机制
在JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程生而生,随线程灭而灭(不需要管理);
全栈程序员站长
2022/11/04
1.5K0
java1.8垃圾回收机制_JAVA垃圾回收机制
JVM垃圾回收
最近又复习下jvm相关内容,理解下思想,吸收下前辈经验,本文jdk 1.7/1.8
Dlimeng
2023/06/30
1480
JVM垃圾回收
深入解析Java垃圾回收机制:原理、实现与优化策略
今日推荐 《Redis 单线程模型工作原理》这篇文章介绍了Redis 使用了 IO 多路复用技术来提高单线程处理网络请求的效率,但在高并发、大数据量传输的场景下,单线程处理网络 I/O 可能无法满足性能要求。 通过引入多线程来处理网络 I/O,可以同时处理多个客户端的请求和数据传输,从而显著提高网络通信的效率,提升 Redis 的整体性能。
Front_Yue
2024/11/17
3480
深入解析Java垃圾回收机制:原理、实现与优化策略
先有JVM还是先有垃圾回收器?
是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,垃圾回收最早起源于1960年诞生的LISP语言,Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析JVM的垃圾回收~
JavaSouth南哥
2024/05/14
4540
先有JVM还是先有垃圾回收器?
Java 的垃圾回收机制
Java的垃圾回收机制(GarbageCollection,简称GC)是Java语言管理内存的核心特性之一,它使得开发者无需手动释放对象所占用的内存,系统会自动检测并回收不再使用的内存空间。下面从几个关键方面为你详细讲解Java的垃圾回收机制。
用户11115400
2025/04/27
1620
jvm的垃圾回收算法_jvm默认的垃圾回收器
相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行,但在真正了解垃圾回收算法之前,有必要对JVM的对象的引用做一个简单的铺垫
全栈程序员站长
2022/11/17
7450
jvm的垃圾回收算法_jvm默认的垃圾回收器
深入解析java虚拟机:垃圾回收,最大并发标记清除垃圾回收器
CMS GC的全称是最大并发标记清除垃圾回收器(Mostly Mark andSweep Garbage Collector),可以使用-XX:+UseConcMarkSweepGC开启。CMS GC的新生代清理仍然使用与Parallel GC类似的方式,即开启多个线程一起清理,且在这个过程中,Mutator线程不能工作。从算法上来说,该过程与Serial GC、Parallel GC的YGC完全一致;从逻辑上来说,该过程与Parallel GC的Young GC几乎一致,所以这里不再赘述。不同点是CMS GC多了个专门针对老年代的Old GC,图10-8简单说明了Old GC的概念。
愿天堂没有BUG
2022/10/28
5090
深入解析java虚拟机:垃圾回收,最大并发标记清除垃圾回收器
jvm之垃圾回收标记相关算法解读
在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。
一个风轻云淡
2023/10/15
2500
jvm之垃圾回收标记相关算法解读
【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法
在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间。内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的。就是解放了程序猿手动回收内存的工作,交给垃圾回收器来自动回收。
猿人谷
2020/06/19
4070
深度解析Java虚拟机(JVM)的垃圾回收机制
在现代软件开发领域,Java作为一门强大的编程语言,因其跨平台性、安全性和性能而备受欢迎。然而,Java程序也需要面对内存管理的挑战,而这正是Java虚拟机(JVM)垃圾回收机制的重要组成部分。本文将深入探讨JVM垃圾回收机制的工作原理,并通过详细的Java代码示例来解释其实现方式,帮助开发人员更好地理解和优化内存管理。
疯狂的KK
2023/09/15
4560
深度解析Java虚拟机(JVM)的垃圾回收机制
jvm5:14-15 垃圾回收概述+算法
知道哪几种垃圾收集器,各自优缺点,重点讲下cms和g1,包括原理、流程、优缺点,垃圾回收算法的实现原理
用户10832809
2025/02/25
970
GC 垃圾回收
我们知道Java是一门面向对象的语言,在一个系统运行中,会伴随着很多对象的创建,而这些对象一旦创建了就占据了一定的内存,在上一篇中,我们介绍过创建的对象是保存在堆中的,当对象使用完毕之后,不对其进行清理,那么会一直占据内存空间,很明显内存空间是有限的,如果不回收这些无用的对象占据的内存,那么新创建的对象申请不了内存空间,系统就会抛出异常而无法运行,所以必须要经常进行内存的回收,也就是垃圾收集。
栗筝i
2022/12/01
2720
GC 垃圾回收
相关推荐
JVM之垃圾回收相关算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档