目录:
- Java程序测试:JVM调试体系, Intellij 调试, Junit自动化
- Java程序监控: 常用监控工具, 性能问题
- Java典型问题:锁问题, 线程池问题,JVM内存基础介绍, JVM内存问题分析与定位, TLS问题, Crash问题
JVM调试体系
简介
JPDA 全称 Java Platform Debugger Architecture. 是Java定义的标准调试框架。
大部分调试工具都是基于JPDA提供的上层接口,扩展定制而来的。
JVM TI基本原理
JVM TI 是JVM提供的native 编程接口,可以用来获取JVM内部状态,以及控制Java程序的执行。
JVM TI 的典型能力:
- 各类事件的钩子(比如类加载)
- Java对象操控
- Java线程和锁操控
- 基本调试原语(比如断点)
一般采用建立一个Agent方式来调用JVM TI , 而控制方往往是另一个独立的进程。
Agent加载的方式:
- 在JVM启动时,通过命令行选项指定Agent加载。
- JVM运行时加载。(attach机制)
Java动态追踪技术
JVM内置的 libinstrument.so
可基于这套 instrumentation 用Java开发Agent。
- 监控指定方法的执行内容,比如入参,返回值;
- 指定方法的调用情况,eg,时间戳,调用次数,耗时。
- 指定方法的调用路径等。
IntelliJ调试
条件断点
双击shift : 搜索
ctrl 单击 : 查看当前变量或方法被哪些代码引用
Junit自动化测试
junit & Mockito
mock test: 如何在不受其他模块影响的情况下测试一个单独的模块。
常用监控工具
基础故障处理工具
Jps , Jstat, Jinfo,
Jmap: 生成堆转储快照
JHat ,
Jstack: 当前线程的快照。
可视化故障处理工具
JConsole, VisulVM
JMC: 可持续的在线监控工具。
MAT: 内存分析工具
常用linux诊断命令
strace: 追踪系统调用,获取进程动态信息,获取系统级调用,即程序现在在干什么。
代码语言:javascript复制 eg: strace -o strace.txt -T -tt -e trace=all -p <pid>
pstack: 显示进程的线程堆快照。
代码语言:javascript复制 eg: pstack <pid> >> pstack.log
pmap: 查询进程的内存映射关系,常用于排查内存泄露。
代码语言:javascript复制 eg: pmap -x <pid>
vmstat:监控整个系统资源使用情况。
top: 显示各进程的资源占用状况。
代码语言:javascript复制 eg: top -H -p <pid>