垃圾回收思路-阅读java编程思想

  • 引用计数:引用计数是一种简单但是相对而言速度不高的垃圾回收的思路,简单来说就是垃圾回收器会在对象的引用计数变为0的时候进行回收,但是这种回收机制可能导致存在“应该回收的对象得不到回收”——也就是当对象之间存在循环引用的时候,可能会出现“对象应该被回收,但是其引用计数不为0”的情况,这种时候,垃圾回收器定位这种交叉自引用的对象组所需要的工作量很大
    • 这引入了一个交叉自引用对象的问题,这种情况下,通过寻找“活”的对象来追溯其存活在堆栈或静态存储区中的引用——大概意思就是追踪堆栈和静态存储区发现的每个引用对应的对象,然后接着追踪每个对象对应的所有引用,反复知道找出所有“活”的对象。
  • 停止-复制(stop-copy):这种方式简单来说就是暂停程序然后将内存中存活对象复制到新的一块内存,同时将活的对象紧凑排列,另外的都是垃圾,进行回收。这种方式存在的问题就是需要比原空间大一倍的空间来复制搬运,与此同时,很多时候,程序运行稳定之后,产生的垃圾数量可能很少,因此将所有内存从一处复制到另一处有些得不偿失。
  • 标记-清扫(mark-and-sweep):首先同样是寻找所有“活”的对象,然后每次找到一个“活”的对象,就给对象设一个标记,标记过程中不进行清扫,标记完成之后,开始清理,没有标记的对象被清理,空间被释放,这样过后堆的空间很可能会不连续,此后需要重新整理剩下对象,进行紧凑
  • java虚拟机回收方式:Java虚拟机中,内存分配以“块”为单位,每个块都有相应的代数来记录其是否还存活,回收的时候垃圾回收器可以向废弃的块复制对象,垃圾回收器会定期进行完整的清理动作——大型对象仍然不会被复制(只是块的代数增加),内含小型对象的那些块则会被复制并且整理。Java虚拟机会进行监视,如果所有对象都很稳定(也就是说垃圾产生量不大),垃圾回收器效率降低的话,就切换到“标记-清扫”的方式,否则,切换到“停止-复制”的方式,这种方式我们将其称之为自适应式的垃圾回收方式。(这里的回收我理解大概意思就是,大的对象直接占据一个块,所以通过块引用来考虑回收问题,而针对部分存储了多个小对象的块而言,需要细致到块之中采用复制式的方式来整理回收)

 

 

边学习边修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值