1、JVM调试实践搞定jvm,解决线上故障不求人JVM内存管理JVM线程JVM常用调试工具常见故障分析流程 线上故障实例分析JVM内存管理堆区存储所有对象不存储基本类型JVM只有一个堆区,被所有线程共享栈区栈中只保存基础数据类型和对象的引用每个线程都有一个独立的栈区每个栈中的数据都是私有的,其他栈不能访问main方法a方法int i=0b方法objObject()栈区堆区JVM线程Linux与JVM一个Linux进程可以存在多个线程一个JVM对应Linux中的一个进程JVM中的线程对应Linux进程中的线程可以通过Linux进程中的线程,找到JVM对应的线程JVM线程状态NEWTERMINATED
2、RUNNABLETIME_WATINGGWAITINGBLOCKEDBLOCKED等待进入synchronized块或方法的锁等待从Object.wait中重新进入synchronized块或方法的锁WAITINGObject.waitThread.joinLockSupport.parkTIMED_WAITINGThread.sleepObject.waitThread.joinLockSupport.parkNanosLockSupport.parkUntilJVM常用调试工具jstack线程名字线程优先级linux对应的线程id当前线程状态线程栈内容查看JVM的所有线程栈信息jstack
3、$pidjstack-l$pidjmapjmap-heap$pid 查看堆信息jmap-histo:live$pid 或 jmap-histo$pid查看堆中实例统计信息jmap-dump:format=b,file=$FILE$PID将堆信息dump到本地jstatjstat-gcutil$pia$频率$次数监控垃圾回收情况jhatjhat$file分析jmap命令dump出的堆信息,并对外提供一个http服务用于访问常见故障分析流程cpu load高通过“ps-mp$PID-o THREAD,tid,time”或“top Shift+H”等命令找出哪个linux线程使用cpu高使用“jstack$pid”命令得到JVM的线程栈信息将第一步得到的线程id从十进制转换为十六进制,并在第二步得到的线程栈信息中搜索,找到出问题的线程栈分析对应线程栈的源码,定位问题普通OutOfMemory根据jstat命令确定OOM趋势使用jmap命令定位溢出的对象分析溢出对象相关的源码并发相关死锁在jstack打印出的log中,会有deadlock的提示多个线程竞争同一资源分析jstack日志中的线程状态JVM诡异的并发bugjstack,jmap,jhat等工具一起上线上故障实例分析