1. 如果在Tomcat部署多个服务,JVM启动个数是根据服务来算,还是根据tomcat来算的?

答:一个Tomcat启动多个Web应用,那JVM只有一个,就是Tomcat自己,你的Web应用都是一堆代码,由Tomcat根据配置文件来对指定的请求调用你的代码。

2. Minor GC、Major GC和Full GC这几个概念到底有什么区别?Minor GC怎么也会STW?

答:不管是老年代回收还是新生代回收,都要Stop the World,因为必须让程序别创建新对象,才能回收垃圾对象。

Full GC和Major GC其实是一个概念,都是指的老年代的GC,只不过一般会带着一次Minor GC,也就是Young GC,他们是一个概念多种名词。

3.如何只做ygc?和垃圾回收器有关吗?

答:和垃圾回收器无关,不同垃圾回收器,差别只在于性能和吞吐量的区别。不影响回收的时机。

根据堆中对象生存周期特点,合理分配Eden S0 S1 大小,尽量让对象在新生代就被回收,需要注意的是要开启内存担保。

4. 为什么说Minor GC是很快的?而老年代的Full GC很慢?

答:新生代回收存活很少,且采用了复制算法,迁移内存很快,然后一次性清理垃圾对象,这就比标记整理效率高。

老年代要先挪动对象压在一起,存活对象那么多,就涉及到漫长的对象移动的过程,所以速度慢。

而且老年代垃圾回收时,GC Roots追踪所有对象,由于老年代存活对象太多,所以耗时更长。

5. 面试题,parnew+cms的gc,如何保证只做ygc,jvm参数如何配置

答:从两个方向考虑:避免Full GC避免年轻代对象进入老年代

1、 避免Full GC

1、 保证老年代可用空间大于新生代所有对象,避免MinorGC前进行FullGC;
2、 如果1可用保证,那后面-XX:HandlePromotionFailure、进入老年代的对象平均大小等比较就不需要考虑了;
3、 保证MinorGC后存活对象不大于Survivor空间;

2、 避免年轻代对象进入老年代

1、 根据实际情况查看每次MinorGC后存活对象的大小,设置合适的Survivor区域大小,保证存活对象进入survivor区,而不是进入老年代;
2、 根据对象存活的时间以及MinorGC的间隔时间,确定年龄比如:3分钟一次MinorGC,而对象可以存活1小时,那就把对象年龄设置到20,避免对象15岁进入老年代;
3、 大对象可以偶尔创建一个,可以设置-XX:PretenureSizeThreshold,使其分配至年轻代如果创建销毁频繁,就让其直接进入老年代,利用对象池避免频繁创建销毁;

6. 为什么新生代用的是复制算法?老年代用的是标记整理算法?既然复制算法比较快,为什么老年代不采用新生代的这种优化版的复制算法呢

答:因为老年代的存活对象太多了,采用复制算法来回挪动大量的对象,效率更差。

7. 新生代与老年代垃圾回收耗时不同的原因

答:判断对象是否存活通过遍历GC Roots,遍历过程中可能会发现,能被GC Roots关联到的对象中,新生代可能占到了1%,老年代占到了99%,然后从被关联到的对象出发追踪存活对象。

所以1%对象的追踪时间和99%的对象追踪时间是不一样的,也就是说老年代追踪时间大概是新生代的99倍。再加上老年代需要碎片整理。所以老年代垃圾回收的时间比新生代长的多。

8. 存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况

答:新生代垃圾回收会直接STW,系统不能运行了,所以必须等垃圾回收完了,才能再次GC;

老年代垃圾回收是有可能的,因为采用了并发收集的机制,一边回收,系统一边运行,也许没回收完就再次触发Full GC,此时会进入STW,用Serial Old来回收。

9. Minor GC也会 STW吗?是什么时候

答:是的,新生代也会STW,是在跟踪复制阶段进行STW,但是他速度很卡,就是从GC Roots触发标记出来少量存活对象,转移到空的 Survivor里,然后直接清空所有垃圾对象。

10. 标记清理和标记整理算法的区别

答:标记清理是先标记再清理,CMS是这种算法,然后再整理;标记整理是先标记再整理,最后才清理。