「JVM基础」——垃圾回收基础(GC相关)

 我来答
世纪网络17
2022-07-20 · TA获得超过6011个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:151万
展开全部

当内存中的某一个对象无法找到任何引用的时候,这个对象就是一个垃圾对象。

内存泄露(memory leak),是指程序中已动态分配的堆内存由于某种原因程序未将其释放或无法释放,造成了内存的浪费,导致程序运行速度减慢甚至程序崩溃等严重后果。

STW即stop the world ,指的是JVM进行GC时会暂停所有业务线程。

给每一个对象添加一个引用计数器,t每当有新的引用时,计数器+1,引用结束后计数器-1。任何时刻计数器为0的对象都是不被引用的。

优点:
1. 引用计数算法在回收垃圾时具有实时性。当一个对象的引用为0的时候会被直接回收,无需等待特定时间就可以释放内存。
缺点:
1.当出现对象之间循环引用的时候,垃圾回收期无法确定这些对象是否是垃圾,因此无法回收循环引用的对象。(内存泄漏)

从GC Roots节点(起始节点)出发向下搜索,如果没有任何引用链(既GC root不可达),则证明此对象不可用

tracing GC的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。GC roots这组引用是tracing GC的起点。要实现语义正确的tracing GC,就必须要能完整枚举出所有的GC roots,否则就可能会漏扫描应该存活的对象,导致GC错误回收了这些被漏扫的活对象。

将需要清除的对象标记出来,清除掉。

标记清除算法的实现分为两个阶段:

优点:
只对存活的对象进行标记。标记完毕后再扫描整个空间中未被标记的对象进行回收。该算法不需要进行对象的移动,只需对不存活的对象进行处理,效率高。
缺点
因为直接回收掉了不存活对象,未对内存进行整理,因此会产生内存碎片。内存碎片较多时,当大对象进入内存空间,无法为期分配足够的内存会提前触发GC。

将内存一分为二,每次使用一个区域。当触发gc时,将存活对象复制到另一区域,清除原区域。

它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集合(GC Roots)中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。

优点

缺点:

标记清除算法的优化实现,清除垃圾对象的同时压缩空间。

该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后再清理掉无用对象

优点:
1.因为对空间进行了整理,因此不会产生内存碎片。
缺点
1.因为扫描了两次,并且在清除的基础上还增加了整理,因此时间成本高。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shb-洁天
2024-04-15 广告
上海洁天机械有限公司,经过前期的探索、研发设计、创新,在2004年4月正式成立,专业自主开发洁天牌(JT系列)全不锈钢数控防爆溶剂回收机,并二次通过国家防爆认证(为五年一次)。凭借在废有机溶剂处理行业十年多的扎实基础和经验,尽心尽力帮助客户... 点击进入详情页
本回答由shb-洁天提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式