java垃圾回收机制中的引用计数算法

垃圾回收机制

java 语言中一个显著的特点就是引入了java回收机制,是c++程序Q员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,iava中的额对象不在有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。

内存泄露 :指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要

它的时间长度,我们有是也将其称为"对象游离";

垃圾回收机制的算法

java语言规范没有明确的说明JV 使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做两件基本事情:

(1)发现无用的信息对象;(2)回收将无用对象占用的内存空间。使该空间可被程序再次使用。
1.引用计数法(Reference Counting Collector)

算法分析:

当引用计数算法是垃圾回收器中的早起策略,在这种方法中,堆中的每个对象实例都有一个引用计数器,点一个对象被创建时,且该对象实例分配给个变量,该变量计数设置为1,当任何其他变量赋值为这个对象的引用时,计数加1,(a-b,则b引用的对象实例计数器+1) 但当一个对象实例的

某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1,任何引用计数器为0 的对象实例可以当做垃圾收集。 当一个对象的实例被垃圾收集是,它引用的任何对象实例的引用计数器减1。

引用计数机制,是一个简单有效的机制,但存在两个关键的问题

问题一:消耗额外的内存空间

要给每个对象都安排一个计数器(如果计数器按照两个字节算)如果整个程序中的对象数目很多,总的消耗的空间也会非常多。

尤其是如果每个对象体积比较小(假设每个对象4个字节)计算器消耗的空间,已经达到对象空间的一半了。

公摊面积~~ 总楼层越高 公摊面积越大~~实际的得房率越低~~

问题二:引用计数可能会产生"循环引用问题"此时,引用计数就无法正确工作了

先进行下述工作

java 复制代码
class Test{
Test t;
}
Test a = new Test();
Test b = new Test();

然后紧接着把 a.t = b; b.t = a;

java 复制代码
a.t = b;
b.t = a;

由上述操作以后就变成了两个对象四个引用,每个对象都是两个引用指向他。

然后在进行如下操作

java 复制代码
a = null;
b = null;

上述代码出现问题了!!!

此时两个对象,引用计数都不是0 ! ! 不能被GC回收! ! 但是这俩对象又无法使用! !

非常类似于" 死锁 "

总结

既然他纯在这样的问题Java就没有引入这样的方法,而Java中实际使用的方案是"可达性分析"。

相关推荐
ZhengEnCi几秒前
🚀创建第一个 SpringBoot 应用-零基础体验开箱即用的神奇魅力
java·spring boot
宠友信息4 分钟前
仿小红书短视频APP源码:Java微服务版支持小程序编译的技术解析
java·微服务·音视频
RTC老炮4 分钟前
webrtc弱网-RobustThroughputEstimator源码分析与算法原理
网络·算法·webrtc
努力努力再努力wz6 分钟前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
听风吹等浪起20 分钟前
分类算法-逻辑回归
人工智能·算法·机器学习
敲代码的嘎仔21 分钟前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
夜晚中的人海34 分钟前
【C++】智能指针介绍
android·java·c++
yacolex39 分钟前
3.3_数据结构和算法复习-栈
数据结构·算法
正在走向自律1 小时前
RSA加密从原理到实践:Java后端与Vue前端全栈案例解析
java·前端·vue.js·密钥管理·rsa加密·密钥对·aes+rsa
茉莉玫瑰花茶1 小时前
动态规划 - 两个数组的 dp 问题
算法·动态规划