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是这种算法,然后再整理;标记整理是先标记再整理,最后才清理。