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、内存情况判断是否线程池核心线程数和最大线程数设置值过小。