跳至主要內容
JVM故障实践之GC篇

案例:ThreadLocal使用不当,导致内存泄漏,进而触发OOM

1.场景分析

故障问题排查说明

​ 针对CPU飙升问题,可按照相关步骤进行排查,如果确认是由于线程大量GC导致的CPU飙升问题,则可进一步进入GC问题排查

步骤 指令 说明
1 top 查看占用cpu高的进程信息
2 jstat -gcutil pid 查看gc状况
3 jmap -dump:format=b,file=name.dump pid 导出dump文件
4 visualVMMAT工具分析 用visualVM分析dump文件

holic-x...大约 13 分钟JAVA基础
⑥JVM JVM故障问题排查

学习核心

  • 内存泄漏问题排查
    • GC引起CPU飙升问题排查(5个步骤一步步定位)
    • 现场保留(瞬时信息和历史信息的记录保留,后续进行跟踪分析)
      • 常用工具:jinfo、jstat、jstack、jhsdb(jmap)等工具,尤其是jmap(分析处理内存泄漏的利器)
    • 一个卡顿实例分析(结合卡顿实例,掌握分析思路和实践过程)
      • 高并发业务场景中启用swap造成的服务卡顿
    • 内存泄漏 VS 内存溢出
      • 区分内存泄漏(原因)和内存溢出(结果)概念
      • 内存泄漏现象
      • 内存泄漏案例(HashMap使用不当、文件操作资源未及时释放、JavaAPI使用不当、ThrealLocal使用误区)

holic-x...大约 58 分钟JAVA基础
④JVM 类加载机制

学习核心

  • 类的生命周期
    • 掌握类的生命周期核心(每个节点的作用)
    • 结合案例理解类的生命周期构建流程
    • 自定义类加载器(自定义类加载器实现、场景应用、常见自定义加载器(一些破坏双亲委派的场景))
  • 类加载器和类加载机制
    • 类加载器(分类)
    • 双亲委派机制
    • JDK9之后类的加载委派关系
  • JVM优化-降低类加载开销
  • 类加载机制之开发常见实用技巧

holic-x...大约 30 分钟JAVA基础
①JVM JAVA内存区域

学习核心

  • JVM内存区域

    • JVM 核心概念
    • 内存结构图示和各个部件的作用
      • 宏观划分:线程栈、堆内存,以及各自的分类和实现
      • 不同JVM实现(不同厂商或者同一厂商的不同版本的变化)
    • JMM核心:规范线程之间的交互操作
    • 扩展概念:重排序、内存屏障
  • 结合内存区域的划分,分析OOM的可能性分别对应哪个内存区域的异常状况


holic-x...大约 38 分钟JAVA基础
②JVM 垃圾收集器和内存分配策略

学习核心

  • 对象已死
    • JAVA中的引用
    • 可达性分析算法
  • 垃圾收集算法
    • 垃圾回收算法
      • 标记-清除算法
      • 标记-整理算法
      • 复制
      • 分代收集
  • 垃圾收集器
    • Serial收集器
    • ParNew收集器
    • Parallel Scavenge收集器
    • Serial Old收集器
    • Parallel Old收集器
    • CMS收集器
    • G1收集器
  • 内存分配和回收策略

holic-x...大约 35 分钟JAVA基础
⑥JAVA 线程池和Exector框架

学习核心

  • JAVA线程池
    • 线程池原理、为什么引入线程池
    • 线程池的核心参数
  • Executor框架
    • 两级调度模型
    • 框架结构:核心API
    • 框架成员
  • ThreadPoolExecutor详解
  • 性能优化
    • 为什么建议用ThreadPoolExecutor自定义线程池而不使用默认提供的方法
    • 如何合理分配线程池大小
    • 线程池如何实现动态修改
    • 使用无界队列的线程池会导致什么问题?

holic-x...大约 40 分钟JAVA基础