首页IT科技垃圾回收机制保证了Java程序不会出现内存溢出(垃圾回收机制)

垃圾回收机制保证了Java程序不会出现内存溢出(垃圾回收机制)

时间2025-05-26 12:27:34分类IT科技浏览3860
导读:垃圾回收机制 什么是垃圾回收机制 垃圾回收机制是专门回收没有被变量名绑定的垃圾数据 用来释放空间...

垃圾回收机制

什么是垃圾回收机制

垃圾回收机制是专门回收没有被变量名绑定的垃圾数据 用来释放空间

引用计数

引用计数就是数据值与变量名之间绑定的次数

age = 18 #数据值18的引用计数为1 引用计数增加: x = age #数据值18的引用计数为2 把age的内存地址给了x,此时age和x都绑定了18 所以18的引用计数为2 引用计数减少: age = 20 #数据值18的引用计数变成1 变量名age与数据值18解除绑定,再与20绑定,所以数据值18的引用计数从2变成了1 del x #数据值18的引用计数变成0 解除变量名m的绑定关系,所以数据值18没有变量名绑定,引用计数就从1变成了0qw

引用计数:当数据值身上的引用计数为0时 就会被当成垃圾回收机制回收 不为0则不会回收

缺陷:引用计数可能会造成循环引用问题

标记清除

标记清除主要是解决循环引用的问题

​ 哪些情况会使引用计数增加:

被变量名绑定时 ​ 被列表索引和字典k索引时

​ 什么情况下 引用计数会减少

变量名与数据值解除绑定时 ​ 索引的列表或字典被回收时

引用计数来解决垃圾问题是有隐患的 >> 循环问题

# 看以下一段程序 l1 = [a] # 两变量分别绑定了一个列表 l2 = [b] # 两个不同的列表分别引用计数为1 l1.append(l2) # l1 = [a, l2] 列表2的引用计数加为2 l2.append(l1) # l2 = [b, l1] 列表1的引用计数加为2 del l1 # l1变量断开,列表1引用计数-1 del l2 # l2变量断开,列表2引用计数-1

我们可以发现 最终内存中的数据值已经没有变量绑定了 找不到了 符合垃圾的定义 但是身上还有计数 没有被回收

所以就产生了可一个机制 :

​ 当内存占用达到临界点时 程序就会停止运行 扫描程序中的所有数据值 把产生循环的数据打上标记 最最后统一清除掉 >> 标记清除

分代回收

分代回收一般分为三代: 新生代 青春代 老年代 数据值身上的计数越多 越不容易被清除 所以越容易放在下面 越往下 扫描间隔的时间越长 越在上面扫间隔的时间越短

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
利用404页面和搜索引擎,轻松交到志同道合的朋友!(404页面与搜索引擎相结合,让交友不再难!) docker运行jar和直接运行jar(【云原生 | 23】Docker运行Web服务实战之Tomcat)