浅谈垃圾回收机制

了解垃圾回收机制?
  比较C语言和java语言的垃圾回收机制。
就垃圾回收机制来说:C语言的垃圾回收,是人工的,工作量大,可控性较高
与此相反的是java语言的垃圾回收机制是自动的,可控性较低。有时候会出现内存溢出的情况
就是说jvm为对象分配了大量的内存,超出最大对象的存储内存。
***在java中垃圾回收机制中的方法system.gc(),当方法被调用时,垃圾回收机制会尝试回收未被使用的内存空间
和回收被丢弃对象的内存空间,然而这个方法的调用附带一个免责声明,无法保证对垃圾收集器的调用以说system.gc()
并不能完美的主动进行了垃圾回收。
====那么我们应当如何了解java垃圾回收机制呢?
    ***我们从三个方面对垃圾回收机制进行理解
     1、jvm如何确定哪些对象要被回收?
     2、jvm如何确定什么时候进行垃圾回收?
     3、jvm又是如何清除垃圾对象的呢?
     
     *****在确定那些对象要被进行回收涉及到两个主要的算法:引用计数法、可达性分析法。
     --引用计数法:就是说根据对象的引用次数,为对象设置一个引用计数器,调用一次+1,不被调用-1,当对象的
     的引用次数为0时,就会被垃圾回收机制回收。但这种算法目前不在垃圾回收机制中使用,因为他不能解决循环问题
     对象A中有属性B;对象B中有属性A,A与B之间相互调用,垃圾回收机制无法识别
     --因为引用计数存在的缺陷,因此,引入了可达性分析算法。
     --通过判断对象的引用链是否可达来判断对象会不会被回收。可达性分析是从离散的数学图论中引入的程序把所有的引用关系看作一张图,
     通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。
     当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。
====JVM会在什么时候回收垃圾呢?
    1、会在cpu空闲的时候进行垃圾回收
    2、在堆内存满的时候进行垃圾回收
    3、主动调用system.gc()方法进行尝试回收
===JVM如何进行回收呢?
  这里讲到垃圾回收的算法。标记-清除算法、标记-整理算法、复制算法、分代收集算法。
  ****1 标记-清除算法。
 这是最基础的一种算法,分为两个步骤,第一个步骤就是标记,也就是标记处所有需要回收的对象,
标记完成后就进行统一的回收掉哪些带有标记的对象。这种算法优点是简单,缺点是效率问题,
还有一个最大的缺点是空间问题,标记清除之后会产生大量不连续的内存碎片,
当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而造成内存空间浪费。
 ****2、复制算法。
 2复制算法。
复制将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。
当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。
只是这种算法的代价是将内存缩小为原来的一半。
*****标记-整理算法:
标记整理算法与标记清除算法很相似,但最显著的区别是:标记清除算法仅对不存活的对象进行处理,
剩余存活对象不做任何处理,造成内存碎片;而标记整理算法不仅对不存活对象进行处理清除,
还对剩余的存活对象进行整理,重新整理,因此其不会产生内存碎片。
*****分代收集算法:
分代收集算法是一种比较智能的算法,也是现在jvm使用最多的一种算法,他本身其实不是一个新的算法,
而是他会在具体的场景自动选择以上三种算法进行垃圾对象回收。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值