【GC的过程】

news/2024/11/17 16:32:13/

文章目录

    • 1. 标记阶段
    • 2. 清除阶段
    • 3. 压缩阶段
    • 小故事

GC(垃圾回收)是程序自动管理内存的一种机制,通过扫描内存中的对象和引用,自动确定哪些对象是已死的(即无法再被访问),并将这些对象标记为垃圾,释放它们所占用的内存空间。下面我们将介绍GC的过程,并附上Java代码示例来说明。

1. 标记阶段

在标记阶段,GC扫描所有的对象,找出所有可达对象,这些对象是指在应用程序中仍然被引用的对象,将这些对象标记为存活对象。未被标记的对象就会被判定为垃圾。为了实现标记过程,GC需要对整个堆进行扫描,记录哪些对象是存活对象。

Java代码示例:

public class GCExample {public static void main(String[] args) {// 创建对象Object obj1 = new Object();Object obj2 = new Object();Object obj3 = new Object();// 将obj1和obj2设为相互引用obj1.setReference(obj2);obj2.setReference(obj1);// 将obj3设为root对象root = obj3;// 执行标记过程mark(root);}// 在标记过程中,使用递归算法遍历所有存活对象public static void mark(Object obj) {if (obj.isMarked()) {return;}obj.mark();Object[] references = obj.getReferences();for (Object ref : references) {mark(ref);}}
}

在上面的代码示例中,我们创建了三个对象obj1、obj2和obj3,并将obj1和obj2相互引用,将obj3设置为root对象。在执行mark方法时,从根对象obj3开始,使用递归算法遍历所有存活对象,将遍历到的对象标记为存活对象。

2. 清除阶段

在清除阶段,GC清除被标记为垃圾的对象,收回它们所占用的内存空间。清除过程是在后台进行的,应用程序不会受到影响。在清除过程中,GC会将被标记为垃圾的对象从堆中清除。这些对象的内存空间将被释放,以便可供后续程序使用。

Java代码示例:

public static void sweep() {for (Object obj : heap) {if (!obj.isMarked()) {heap.remove(obj);} else {obj.unmark();}}
}

在上面的代码示例中,我们遍历整个堆,对于所有没有被标记的对象,将其从堆中清除。而对于被标记了的对象,将其标记状态重置为未标记。

3. 压缩阶段

在压缩阶段,GC会将存活对象向堆的一端移动,以便获得一块连续的内存空间。这个过程也称为内存整理。这个过程的目的是使内存空间更加紧凑,并且减少内存碎片的数量,从而提高内存利用率。

Java代码示例:

public static void compact() {int offset = 0;for (Object obj : heap) {if (obj.isMarked()) {obj.move(offset);offset += obj.getSize();}}
}

在上面的代码示例中,我们遍历所有存活对象,将它们向堆的一端移动,并更新它们在堆中的位置。在移动对象时,我们需要记录它们的偏移量,以便正确地更新它们的引用。

以上就是GC的三个阶段:标记阶段、清除阶段和压缩阶段。这些阶段的实现方式因开发语言而异,但是它们的基本原理是相同的。

小故事

有一位名叫小明的程序员,在工作中经常使用Java语言编写代码。他知道Java的优点之一是可以自动进行垃圾回收,也就是GC。但是他对GC的具体过程还不是很了解。有一天,他向同事请教,同事给他讲了一个小故事来说明GC的过程:

故事是这样的:有一位园丁在花园里种了一些花,他会定期巡视花园,将枯萎的花朵摘掉。这样,花园里的花就能保持鲜艳美丽。这位园丁就像是JVM的垃圾回收器,花就像是程序中的不再使用的对象。

在Java程序中,当一个对象不再被引用时,垃圾回收器就会将其标记为垃圾对象,并将其从内存中清除。这个过程分为两部分:标记和清除。

标记阶段:垃圾回收器会遍历堆中的所有对象,并标记哪些对象是可达的(被引用的)和哪些对象是不可达的(未被引用的)。

清除阶段:垃圾回收器会清除所有的不可达对象,并释放它们占用的内存空间。

就像园丁巡视花园一样,垃圾回收器需要周期性地运行,以便及时地清理垃圾对象,释放内存。如果垃圾回收器不能及时地清除垃圾对象,程序可能会因为内存泄漏而出现问题,甚至导致程序崩溃。

通过这个小故事,小明理解了JVM GC的过程,他感到更加安心地使用Java语言编写代码。


http://www.ppmy.cn/news/413217.html

相关文章

家用智能投影推荐 五千元档的当贝F5和当贝X3有哪些区别?

最近看到好多网友想选购投影仪,纷纷将当贝F5和当贝X3纳入自己的购物车中,不过在最后下单时却犹豫不决,那么当贝F5和X3之间该怎么选?当贝F5和当贝X3哪个好?让我们一起来看看五千元档的当贝F5和当贝X3有哪些区别&#xf…

Android千元机,大牌Android机不足千元 5款实用手机荐

【IT168 导购】目前手机市场上的货源逐渐充足起来,近期一些热门手机也不再涨价趋于平稳,而现在也是各地学校陆续开学的时候,一些实用又时尚的机型更受关注,像被称为最美Android机的LG GT540也才千元出头,非常适合女生使…

国产智能机利润调查:中高端硬件成本仅千元

导读:在智能手机的时代,国际巨头攫取了90%以上的手机利润。国产手机产业链的成熟,两个人一部电话就能成立一家手机公司,低端 Android 智能机物料成本不足400元,但过度依赖供应链平台易导致核心竞争力的缺失。 腾讯科技…

2013年android智能手机599元大战开战

目前多款adnroid手机4.0寸大屏,双核,做到599元。如果不出意料的话明年大部 分手机厂商可以做到这个价格。 599元确定已经到了,普通人或大众心理购买手机的价格,将会引暴手机市场,但是山寨机必须做到质量好,…

赋能元宇宙 开启智能交互新未来

4月23日,由51CTO主办的“MetaCon元宇宙技术大会2022”在线上成功举办,大会聚焦元宇宙产业政策、学术研究成果、技术创新和行业落地等多个层面。“人机交互与高效能网络落地”专场特邀了多名技术大咖,针对如何实现元宇宙世界人机交互&#xff…

华为4G智能机Assend Mate2定价三千元左右

华为Mate2会有两个版本,美国版使用了高通骁龙400MSM8928双核处理器,而全球版依旧使用了海思的四核1.6GHz处理器,和之前的K3V2E不同,此次华为Mate2上搭载的海思处理器是全新28nm的,而这款处理器的型号未定,华…

电信将大推多款3G大屏千元智能机 首批9月上市

在三大运营商校园市场激战正酣之际,有内部人士透露,中国电信即将大推3G大屏智能手机,将联合酷派、中兴、三星、华为等厂家推出系列大屏千元智能手机,预计首批将会在9月份上市。 自中国电信提出大力发展3G智能手机以来&#xff0c…

Canon大全

周6去参加了Canon的博览会,着重看了一下单反相机,顺带看了一些镜头。不巧的是周三刚出了400D,这次参会只能用手机拍照了。55555~~ 先说说镜头,有一个广播级的摄像镜头DIGISUPER 100xs。简单介绍一下它的参数…