对于中高级面试的时候,不仅要问你一些基本型的概念,比如说:JVM运行时数据区有哪些?虚拟机栈是干什么的?内存是如何分配的?类加载是怎么加载的?垃圾回收算法有哪些?线程与虚拟机栈有什么关系?等等....,
上面的问题看看书也许就ok了,但是下面这两个问题,可能你在很多书上不一定能看得到,就算看得到估计也是零碎的:
CPU持续飙高,该如何处理?
- top 查看当前 CPU 情况,找到占用 CPU 过高的进程 PID=12677。
- top -H -p12677 找出两个 CPU 占用较高的线程,记录下来 PID=3246, 3246转换为十六进制。
- jstack -l 12677> temp.txt 打印出当前进程的线程栈。
- 查找到对应于第二步的两个线程运行栈,分析代码
OOM 异常如何排查?
- 使用 top 指令查询服务器系统状态。
- ps -aux|grep java 找出当前 Java 进程的 PID。
- jstat -gcutil pid interval 查看当前 GC 的状态。
- jmap -histo:live pid 可用统计存活对象的分布情况,从高到低查看占据内存最多的对象。
- jmap -dump:format=b,file= 文件名 [pid] 利用 Jmap dump。
- 使用性能分析工具对上一步 dump 出来的文件进行分析,工具有 MAT 等。
MAT工具的使用案例请阅读
在面试的时候如果能说清楚上面两点也算是面试加分项。真正解决问题的时候会考虑的更加全面一些,比如说:内存参数的配置是否合理?老年代和新生代比例是不是不合理?怎么才合理?等等。