1.为什么要进行垃圾收集?如果创建的对象没用的时候不回收,堆内存很快就会被耗尽,所以需要清理一些无用的对象。2、JVMGC有哪几种类型?新生代的垃圾回收分为三种,称为minorGC,也称为YGC;老年代的垃圾回收称为主要GC;新生代和老年代的垃圾回收称为fullGC,简称FGC。3、如何判断一个对象是否可以被回收?判断一个对象是否可回收的方法有两种,引用计数法和可达性分析算法。引用计数的方法就是维护一个计数器,当有引用指向对象时加一,当引用失效时减一,引用为零时可以回收。主流的JVM不采用这种方式,因为很难解决循环引用问题;可达性分析算法以一系列GCRoots根节点集合为起始节点,从这些节点开始按照引用关系向下搜索。行进的路径称为引用链。如果一个对象与GCRoots之间没有引用链,则称该对象不可达,可以回收。这是主流JVM所采用的方法。4.哪些对象可以作为GCRoots?系统类对象,即jdk自带的类的对象;本机方法引用的对象;活动线程引用的对象;用于锁定的锁定对象。5、不可达对象是否立即回收?不行,一个对象至少要判断两次不可达,才能被回收。如果第一次判断为不可达,第二次可达,则该对象会被复活。6、确定了一个对象要被回收,那接下来怎么处理呢?会被加入到回收队列中,然后Finalizer线程会触发对象的finalize方法对其进行回收。Finalizer线程不会阻塞等待finalize结束,以免阻塞回收队列。7.说说垃圾回收的过程?简单来说就是复制、清空、交换。详细过程是:如果新生代的Eden区对象满了,就会触发YGC,YGC后还活着的对象进入from区,Eden区清空同一时间;当经过YGC后Eden区再次满时,会再次触发YGC对Eden区和from区进行垃圾回收;两次YGC存活下来的对象会被复制到to区,对象的age会加1,然后Eden区和from区会被清空。区身份互换,谁空谁给;当对象的年龄达到阈值,默认为15,就会进入老年代,当老年代满时,会触发fullGC,同时对新生代进行垃圾回收,晚年;triggerfullGC会在腾出空间之前溢出内存。8.垃圾回收算法有哪些?常见的有四种,复制算法、标记清除算法、标记排序算法和分代回收算法。新生代的YGC采用复制算法,垃圾回收后存活的对象会被复制到另一个区域。不产生内存碎片,但内存利用率不高;标记清除是先标记可回收物,然后再回收。不会造成内存空间的浪费,但会造成内存碎片;markclearing是在markclearing的基础上整理内存碎片;新生代对象存活率低,适合使用复制算法;oldgenerationobjectcomparison比较多,所以不适合用copy算法,适合做标记。这种根据不同的内存区域的特点,采用不同的垃圾回收算法的方法称为分代回收。9.你认识哪些垃圾收集者?serialcollector:串行收集器,采用复制算法,新生代使用,单线程,没有线程交互的开销,所以效率高,但工作时会挂起所有其他线程;serialoldcollector:oldserialcollector时代版本,使用标记整理算法;parNew收集器:新生代收集器,使用复制算法,是串行收集器的多线程版本,性能更好;parNewoldcollector:老年代版本的parNew收集器,使用markfinishingAlgorithm;parallelscavengecollector:使用复制算法,jdk8新一代默认使用的收集器,更注重吞吐量,可以更高效地使用CPU;CMS收集器:老年并发收集器,使用标记清除算法,可以与用户线程并发执行。优点是并发操作,暂停低,缺点是会产生内存碎片;G1收集器:使用markfinishing算法的堆收集器,即新生代和老年代都可以使用这个收集器。
