Java调试那点事-博客-云栖社区-阿里云
https://yq.aliyun.com/articles/56
除了IDE之外,JDK也自带了一些命令行调试工具也很方便。大家用的比较多的如下表所示:
命令 描述
jdb 命令行调试工具
jps 列出所有Java进程的PID
jstack 列出虚拟机进程的所有线程运行状态
jmap 列出堆内存上的对象状态
jstat 记录虚拟机运行的状态,监控性能
jconsole 虚拟机性能/状态检查可视化工具
具体用法可以参考JDK文档,这些大家在线上调试应用的时候用的也不少,比如一般线上load高的问题排查步骤是
先用top找到耗资源的进程
ps+grep找到对应的java进程/线程
jstack分析哪些线程阻塞了,阻塞在哪里
jstat看看FullGC频率
jmap看看有没有内存泄露
总结
整个JDPA有非常清晰的分层,各司其职,让整个调式过程简单可以扩展,而这一切其实都是构建在高司令巨牛逼的Java虚拟机抽象之上的,通过JVMTI将抽象良好的虚拟机控制暴露出来,让开发者可以自由的掌控被调试的虚拟机。有兴趣的同学可以运行下附近中的几个例子,应该会有更充分的了解。
而且由于规范的灵活性,如果有特殊需求,完全可以自己去重新实现和扩展,而且不限于Java,举个例子,我们可以通过agent去加密解密加载的类,保护知识产权;我们可以记录虚拟机运行过程,作为自动化测试用例; 我们还可以把线上问题的诊断实践自动化下来,做一个快速预判 ,争取最宝贵的时间。