java中的垃圾回收机制

最近在整理面试题的时候,有好多知识点都觉得似曾相识,知其然不知其所以然,今天就来整理归总一下知识点,巩固自己,也希望能帮助到有志之士能,开整!!!!

关于垃圾回收:

1、既然是垃圾回收,我们首先要明确一点什么是垃圾回收,为什么需要垃圾回收?

    我们一般说的垃圾回收机制就是指内存回收机制:所谓的内存回收机制就是释放掉在内存中已经没用的对象;顾名思义垃圾回收能帮我们节省内存空间,减轻编程的负担;

2、内存回收既然是释放掉没用的对象,那什么样的对象我们才称之为‘垃圾’?

 a、标记计数法:给内存中的对象打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减1,当这个计数为0的时候这个对象可以被回收了(此时该对象就是垃圾),但是这也存在一个问题就是,循环被应用的对象是无法被识别出来并被回收。(循环引用对象的意思就是:例如一个对象A中持有对象B,对象B中持有对象A,那么该对象上的计数恒大与1,就无法被回收)

    b、可达性分析算法:这个算法的思想就是通过一系列的GCRoots作为起点进行向下搜索,节点之间用引用链进行关联,当一个对象到GCRoots没有任何引用链关联的时候,那么这个对象就是可回收对象                 

    那么问题来了,哪些点是可以作为GCRoots的呢

  1. 虚拟机栈(栈桢中的本地变量表)中的引用的对象
  2. 方法区中的类静态属性引用的对象
  3. 方法区中的常量引用的对象
  4. 本地方法栈中JNI(Native方法)的引用的对象

3、知道那些对象是垃圾,剩下的就是如何将这些垃圾回收呢?

    a、标记-清除算法:分为两个阶段:标记阶段,和清除阶段;标记阶段的任务是标记出所有需要被回收的对象(通过可达性分析算法来进行标志处理),清除阶段就是回收被标记的对象所占用的内存空间。

    优点:可以解决循环引用的问题,两个对象不可达,就算两个对象之间相互引用,依然都会被判定为不可达对象

    缺点:最大的缺点就是会产生空间碎片。(回收之后的内存空间不在连续)

      

    b、复制算法:将原有的内存容量分成大小相等的两块,每次使用一块,在垃圾回收的时候,将正在使用的那块内存中的存活对象复制到另一块内存中,将原来的那块内存中的所有对象都清除,完成垃圾的回收。

    优点:存活对象在垃圾回收过程中,是一起被复制到另一块内存中的,所以确保了内存空间是没有碎片的。

    缺点:第一个:复制算法如果在存活对象较多的情况下,耗时很长;第二个:系统可使用的内存空间被减少一半。

    

   c、标记压缩算法:与标记清除算法相似,都是对存活的对象进行标记,不同的是标记压缩算法是将存活的对象压缩到内存空间的一端,然后清理边界外所有的空间。    

        d、分代算法:将内存空间根据对象特点不同进行划分,选择合适的垃圾回收算法,以提高效率。

               

        关于新生代:新生代的对象,绝大部分都是朝生夕死,持续存活的对象较少,适合使用复制算法。新生代内存一般分为eden空间,survivor空间(from空间,to空间)

        关于老年代:在新生代中多次经过垃圾回收都没有被回收的对象,一般会存放到老年代中,而老年代中的垃圾是则通过标记清除算法或者标记压缩算法进行回收。

        关于新生代和老年代之间的交互:

        

       通常虚拟机会将所有的新建对象都放到新生代内存空间中(enden空间)。新生代中的大对象,如果没有被回收会直接进入到老年代中,From空间和to空间就是使用复制算法,to空间存放的就是本次没有被回收的对象,如果to空间中存储满了一会进入到老年代















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值