• 1. JVM调试实践 搞定jvm,解决线上故障不求人
  • 2. JVM内存管理 JVM线程 JVM常用调试工具 常见故障实例分析 Q&A
  • 3. JVM内存管理
  • 4. 堆区存储所有对象 不存储基本类型 JVM只有一个堆区,被所有线程共享
  • 5. 栈区栈中只保存基础数据类型和对象的引用 每个线程都有一个独立的栈区 每个栈中的数据都是私有的,其他栈不能访问
  • 6. main方法a方法int i = 0b方法objObject()栈区堆区
  • 7. JVM线程
  • 8. Linux与JVM一个Linux进程可以存在多个线程 一个JVM对应Linux中的一个进程 JVM中的线程对应Linux进程中的线程 可以通过Linux进程中的线程,找到JVM对应的线程
  • 9. JVM线程状态NEWTERMINATEDRUNNABLETIME_WATINGGWAITINGBLOCKED
  • 10. BLOCKED等待进入synchronized块或方法的锁 等待从Object.wait中重新进入synchronized块或方法的锁线程A线程BBLOCKED
  • 11. WAITINGObject.wait Thread.join LockSupport.park
  • 12. TIMED_WAITINGThread.sleep Object.wait Thread.join LockSupport.parkNanos LockSupport.parkUntil
  • 13. JVM常用调试工具
  • 14. jstack线程名字 线程优先级 linux对应的线程id 当前线程状态 线程栈内容查看JVM的所有线程栈信息jstack ${pid}jstack -l ${pid}
  • 15. jmapjmap -histo:live ${pid} 查看堆中实例统计信息
  • 16. jmap&jhatjmap -dump:format=b,file=${FILE} ${PID}将JVM的堆信息dump到本地objobjobjobj本地文件jhat ${file}对外提供http服务
  • 17. jstatjstat -gcutil ${pia} ${频率} ${次数}监控垃圾回收情况与各个代信息
  • 18. 常见故障实例分析
  • 19. cpu load高通过“top Shift+H”命令找出哪个linux线程使用cpu高 使用“jstack ${pid}”命令得到JVM的线程栈信息 将第一步得到的线程id从十进制转换为十六进制,并在第二步得到的线程栈信息中搜索,找到出问题的线程栈 分析对应线程栈的源码,定位问题
  • 20. 普通OutOfMemory根据jstat命令确定OOM趋势 使用jmap命令定位溢出的对象 分析溢出对象相关的源码
  • 21. 并发相关死锁 在jstack打印出的log中,会有deadlock的提示 多个线程竞争同一资源 分析jstack日志中的线程状态 JVM诡异的并发bug jstack,jmap,jhat等工具一起上
  • 22. Q&A