Java调试与定位

2022-05-06 18:28:57 浏览数 (1)

目录:

  • 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>

0 人点赞