JavaGC是什么?在什么时候?对什么东西?做了什么事情?

1、JavaGC(java garbage collection)是什么?

    GC:及垃圾回收机制,是java所特有的(与C/C++相比),对不使用的对象的销毁,内存回收,又分为MinorGC与FullGC,且不需要专门编码;

   工作机制:通过标记的方式,区别对象是否使用,若不使用则销毁;

2、在什么时候?

    java中的堆分为新生代、老年代、永久代(java中的类以及类加载器本身);

    新生代分为Eden与Survivor(s0,s1),首先,新建的对象都是在Eden区分配内存,当内存不够的时候会产生MinorGC,将Eden区中存活的对象放入S0,并清空Eden区;若再一次发生MinorGC则将S0与Eden区中的存活的对象放入s1区,并且清空s0与Eden区;

    MinorGC执行的次数到达设置的阈值时(默认为15),会将对象放入老年代中;

    若老年代内存不足,则会发生FullGC;

    大对象以及长期存活的对象直接放入老年代;

3、对什么对象?

    在GC执行前,需要先确定那些对象是存活的——可达性分析法;

    可达性分析法:通过一系列成为"GCRoot"的对象为起点,向下搜索,搜索的路径称为引用链;

    面向的对象:本地方法引用指向的对象、常量引用指向的对象、静态变量引用指向的对象、Native方法的引用指向的对象;

    其中,GCRoot的对象没有引用链,则被销毁;

    详情:如果GCRoot的对象没有引用链则标记一次,销毁对象,若重写finalize方法,且为第一次调用,若没有引用链则在标记一次;

    及对象在第一次标记后销毁,且未复活的对象;

4、做什么?

    新生代:复制清理;

        复制算法:将内存分为俩个相等的部分,当A内存用完了,就把存活的对象放到B,并清空A,效率更高。原因是,每次只需要标记存活的对象,且无内存碎片,但是缺点确实,内存的使用率为一半;

    老年代:标记清理;

          标记清理:标记清除算法、标记整理算法;

          标记清除算法,标记需要清除的对象,缺点,速度慢,效率低(标记和删除都很费时间),会产生不连续的内尺碎片,且不利于大对象的分配;

          标记整理算法:标记存活的对象,移动到一段,清理边界以外的内存;

    ps:在老年代中,对象存活率较高,复制法效率太低;

         CMS(并发GC):使用的是标记清除算法;

猜你喜欢

转载自blog.csdn.net/qq_36959774/article/details/85058335