# 五、监控工具

# 1. 如何把 Java 内存的数据全部 dump 出来

  1. 启动的时候进行配置 -XX:+HeapDumpOnOutOfMemoryError + +XX:HeapDumpPath
  2. jmap 命令可以用来查看堆内存使用状况:jmap [option] pid
  3. 在 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 栈大小分配可能过小
上次更新: 8/28/2022, 11:43:26 PM