HIT 软件构造 垃圾回收

空间回收针对三种内存管理模式

  1. 静态管理模式:在静态内存分配模式 下,无需进行内存回收:所有都是已确定的
  2. 在栈上进行内存空间回收:按block(某个方法)整体进行
  3. 在heap上进行内存空间回收,最复杂 ,接下来对这个问题进行详细的讨论。

使用活性决定回收与否

  1. 可达与不可达:与根对象直接相关或者间接相关。
  2. 根对象:默认请记住(静态区域的数据 ,寄存器中的数据,目前的执行栈中的 数据所指向的内存对象)
  3. 在这个图中,根对象只有一个,那就是运行时栈,它指向的地方都是可达的,而标注为黑色的地方都是不可达的。最后将不可达的部分进行回收即可。
    HIT 软件构造 垃圾回收

定义活性对象

在一个根元素中被引用,在一个活对象中引用

定义垃圾回收

识别“垃圾”对象,把其占用的内存加以回收。

GC的成本度量

执行时间,延迟时间,所占用的内存/对程序所使用内存的影响。

如果进行人工GC会怎样/h2>

1.如果太少很多dead oibject都没有回收,会导致内存泄漏(因为你有时候没有办法判断要不要进行对共享的内存回收)
2.如果太多,元那本live的对象却被回收了,会产生悬空指针(也就是对象回收了弹幕是引用还在)

内存回收的基本算法:

1.引用计数(reference counting)
为每个object存储一个计数RC,当有其他reference指向它时,RC加1;当其他reference与其断开时,RC减1;如果RC==0,则回收它 (及其所有指向的object)
优点:简单、计算代价分散,“延迟时间”短(对count的修改是在每行代码执行后进行,而非集中进行)
缺点:在进行循环引用的时候,可能会出现计数错误,并发支持较弱,占用额外的内存空间
2.标记-清除(mark-sweep)
Mark阶段:为每一个object设定状态位(live/dead)并记录;sweep阶段:将标记为dead的对象进行清除。到最后就是跑一个图上的搜索。
缺点:标记清除的效率都不高,内存碎片化
3.标记-整理(mark-compact)
Mark阶段:和标记-清除阶段是一样的;compact阶段:所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
优点:避免了碎片化
缺点:时间消耗太长,影响程序本身
4.复制(copying)
将一个内存空间分成两个部分,现在其中一个进行操作,然后进行标记,没有标记的也就是不需要回收的,就转移到另外一半里面,然后将之前的一半清空。
优点:清除的时候非常的方便;只有存活的数据需要被处理;实现起来很简单
缺点:空间只剩一半,复制可能很浪费时间,所有的引用都必须被更新。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91725 人正在系统学习中

来源:~泊舟~

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年4月25日
下一篇 2019年4月25日

相关推荐