# 五、监控工具
# 1. 如何把 Java 内存的数据全部 dump 出来
- 启动的时候进行配置
-XX:+HeapDumpOnOutOfMemoryError
++XX:HeapDumpPath
。 - jmap 命令可以用来查看堆内存使用状况:
jmap [option] pid
。 - 在 jmc 或者 visualvm 进行导出。
# 2. jstack 的作用?
jstack 主要用来查看某个 Java 进程内的线程堆栈信息:jstack [option] pid
。
# 3. jstat 的作用?
JVM 统计监测工具,查看各个区内存和 GC 的情况。
# 4. 如何定位问题?如何解决问题?说一下解决思路和处理方法
- visualvm 或 jmc 查看内存情况、GC 情况。
- 注意各种特征,考虑是否存在死锁,考虑大对象的分配问题,考虑 GC 的频率和时长和算法选择。
# 5. CPU 使用率过高怎么办?
- 用 visualvm 的飞行记录仪记录一段时间,然后看看哪些是热门的线程,分析这些线程的执行情况。
- 考虑线程死锁、线程竞争资源。
- 考虑 IO。
- 考虑 socket。
# 6. 线上应用频繁 Full GC 如何处理?
- 内存设置可能有问题,整个堆的大小可能过小
- 新生代和老年代的比例不妥当。
- 用飞行记录仪记录,然后分析新生代和老年代的上限是怎样的。
- 检查代码是否频繁分配大对象,看看能不能复用大对象或者及时释放大对象。
- GC 收集器选择是否合理,参数设置是否合理。
# 7. 如果应用周期性地出现卡顿,你会怎么来排查这个问题?
- 多数是 Full GC 导致是 STW,考虑应用如何规避 Full GC 的发生,或者降低 Full GC 的频率。
- 比如增大堆内存,增大老年代比例。
- 具体需要用 visualvm 监控然后根据具体情况分析。
# 8. OOM问题如何处理?
- 内存泄露。
- 对象分配但是没有回收。
# 9. StackOverFlow
- 死循环
- 死递归
- Java 栈大小分配可能过小
← 四、垃圾回收 Spring IoC →