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):使用的是标记清除算法;