jvm004-垃圾回收机制

01,垃圾就是无用的对象,无用的对象就是这个存放在堆中的对象的引用,没有任何变量使用它了。没有变量使用它了,当然需要把它所占用的内存给收回来,好重新使用这个对象占用的内存,来创建新的对象。
02,到底如何去识别那个对象是无用的,那个对象是有用的呢?肯定存在很多算法和机制来解决这个问题。
02.01,引用计数法,最原始的方法,也是很容易理解的方法,给每个对象额外添加一个标记计数器,起始为0,当有变量引用它时,这个标记计数器+1,当这个变量的引用改变或脱离自己的作用域时,这个对象的标记计数器-1,当这个对象的的标记计数器为0时,直接调用垃圾回收线程回收。此算法为实时算法,开销较大,而且无法解决相互调用的问题。
02.02,标记-清除算法,不再是实时的垃圾回收处理了,额外的提供一个线程去处理垃圾回收,遍历每个线程栈中的变量,凡是和此变量相关的对象全部标记为可用;遍历完之后,再去遍历堆中的对象,假如此对象没有标记为可用,那么立即回收此对象。此算法解决了引用计数法的问题,但是此法的垃圾回收线程执行时,所有其他的线程必须停下来。而且此法的垃圾回收线程执行后,内存一片碎片,导致大的对象无法创建。
02.03,标记-清除-压缩算法,为解决上面算法引起的内存碎片问题,可以在上面算法的基础加上一个碎片整理,让这些活着的对象重写排列。
02.04,复制收集器,标记-清除-压缩算法,在排列可用对象时,确实是比较繁琐,每个对象都需要相互靠近来排列,消耗时间比较长,于是可以采用用空间来换取时间的方法,将堆空间分为同等大小的两块,同时使用的只有一块,当一块用完需要垃圾回收时,就将这一块采用标记-清除算法,之后将这一块可用对象全部复制到另一块中,再创建新的对象就在这一块了。
02.05,增量收集器
02.06,分代搜集算法,以上对堆中活动对象碎片问题的解决无非压缩和拷贝,但是很多对象的存活时间不同,如果对所有对象都使用压缩和拷贝的话,存活时间长的对象将消耗垃圾回收的时间,因此可以将堆中对象分块,分几块就牵扯到了具体的算法,一般分两块,即新生代和年老代。在新生代对应的堆中创建对象,分配内存,当到了一定的时间或次数或空间(依赖于具体的算法)后,将存活对象放到年老代。新生代和年老代垃圾回收的频率是不一样的,新生代回收频率大。新生代垃圾回收有多重算法,以上算法都可以,但是最为好的是将新生代再次分代,还是分为两个,创建区和存活区,创建区专门负责创建对象,当创建区满时,将此区回收,把存活对象放到存活区中,存活区采用的是复制收集算法,用空间来换取时间,存活区有两个大小相同的区域1和2。
02.07,并发收集器,
02.08,并行收集器,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值