java手动释放内存对象 finalize_Java中GC(垃圾回收)算法

Java的内存回收主要依赖JVM的垃圾收集器,它使用可达性分析算法判断对象是否需要回收,避免引用计数法的循环引用问题。可达性分析从GC Roots开始,通过一系列引用链确定对象的存活状态。垃圾回收算法包括标记-清除、复制、标记-整理,以及针对不同代际特点的分代收集。此外,安全点和安全区域确保了GC时线程状态的正确处理。
摘要由CSDN通过智能技术生成

github上的地址:DevelopBlog

与C语言不同,Java内存(堆内存)的回收由JVM垃圾收集器自动完成,不需要程序开发者手动释放内存。

从Java内存模型(链接)一文中,我们知道,java中几乎所有的对象实例存储在堆内存中,故而堆内存是JVM垃圾回收的主要阵地。

哪些对象需要被回收?

在讨论GC之前我们需要考虑一个问题?如何确定一个对象是否需要被回收?

两个方法:引用计数法和可达性分析法。

引用计数法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器+1,当引用失效时,计数器-1;当计数器为0,则表明它没有被引用,也就是说可以被GC回收。

优点:此方法简单粗暴,效率很高。很多其他语言也是用这一方法进行对象的回收判断。

缺点:此方法无法解决对象之间的相互循环引用问题。例如:

当前内容已被隐藏,您需要登录才能查看快速登录快速注册

afef9fc50245b5c96f73b360b1442e02.png

image.pngstep1:实例A的引用计数加1,实例A的引用计数=1;

step2:实例B的引用计数加1,实例B的引用计数=1;

step3:实例A的引用计数加1,实例A的引用计数=2;

step4:实例B的引用计数加1,实例B的引用计数=2;

执行

当前内容已被隐藏,您需要登录才能查看快速登录快速注册

之后:实例A的引用计数减1,实例A的引用计数=1;

实例B的引用计数减1,实例B的引用计数=1;

此时,objA与objB相互引用,他们的引用计数器都不是0,除此之外,再无任何其他实际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值