JVM常见面试题

1、class文件是如何被加载到内存的?

2、说一下jvm的内存模型

3、jdk8默认垃圾回收器是什么?与G1回收器有什么区别?

4、jvm的Xmx和Xms如何设置?

先根据apache的推荐来设置值:

1)堆内存Xms、Xmx为一次fullGC后剩下的老年代内存的3-4倍;

2)新生代Xmn内存和堆内存为3:8;

3)永久代内存为一次fullGC后剩下的老年代内存的1.2-1.5倍;

再通过压测分析:

1)(结合线上交易预估日活和峰值,参考二八定律)观察tps是否达标;

2)观察ygc和fgc的频率和每次gc耗时是否都在预期值内(耗时太长影响响应延迟时间,太频繁也会影响延迟时间)

5、哪些情况会导致内存泄露?

6、内存溢出oom如何排查和优化?dump文件怎么分析?

7、说一下双亲委派机制以及有什么作用?

8、生产上应用cpu突然飙升到100%,应该怎么办?哪些原因可能会导致这个情况?

应该怎么办?

1、重启应用,恢复服务,保证可用;

2、线上分析事故原因:

1)(top 查看进程(或者:ps -ef | grep 应用名称 查看进程号) top -Hp PID查看占用cpu从高到低排序线程,jstack PID>jstack.log导出堆栈快照信息日志文件,cat jstack.log|grep 16进制线程号);

2)arthus工具:thread命令显示所有线程并按cpu排序;thread 线程号 命令显示堆栈信息;

存在哪些可能原因?

1、内存耗用严重导致频繁fgc占用资源;

2、应用触发死循环;

3、线程死锁导致线程拥塞;

4、io耗时过长,如存在大量的慢sql;

9、线程池爆满告警了怎么排查问题?

1、jps

2、jstack PID

3、查看RUNNING状态的线程池堆栈信息,看是否存在线程阻塞或等待情况。

4、查看应用日志观察线程执行时间是否正常,如果都正常,结合流量、cpu、内存情况判断是否线程池核心线程数和最大线程数设置值过小。