一、ide 调试基础技巧
1.idea 断点调试(必备)
核心功能:
- 行断点:单击 gutter 设置断点
- 条件断点:右键断点设置条件表达式(如
userid != null && userid > 100) - 日志断点:不暂停程序,仅打印日志(右键 suspend 取消勾选)
- 异常断点:debug 窗口 → view breakpoints → + java exception breakpoints
实用技巧:
alt + f8:evaluate expression 动态执行代码ctrl + f8:快速切换行断点ctrl + shift + f8:管理所有断点- drop frame:回退到方法调用前(堆栈帧),重新执行
二、日志与监控
2.slf4j + logback 动态日志级别
场景:生产环境无法重启,需动态调整日志排查问题。
配置:
# application.yml
logging:
level:
root: info
com.example.service: debug
com.example.mapper: trace
动态修改(无需重启):
// 通过 actuator 端点
@restcontroller
public class logcontroller {
@autowired
private loggingsystem loggingsystem;
@postmapping("/log/level")
public void setloglevel(@requestparam string logger, @requestparam string level) {
loggingsystem.setloglevel(logger, loglevel.valueof(level));
}
}
访问:post /actuator/loggers/com.example.service + body {"configuredlevel": "debug"}
3.spring boot actuator 监控
关键端点:
management:
endpoints:
web:
exposure:
include: health,info,beans,conditions,env,metrics,mappings,loggers
常用调试场景:
/actuator/beans:查看 bean 是否加载/actuator/conditions:查看自动配置生效情况/actuator/env:检查配置文件加载值/actuator/mappings:验证 controller 映射/actuator/metrics:jvm 内存、线程、http 请求统计
三、本地环境模拟
4.docker compose 一键模拟中间件
docker-compose.yml 示例:
version: '3.8'
services:
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
mysql_root_password: root
mysql_database: test
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
redis:
image: redis:7-alpine
ports:
- "6379:6379"
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "9092:9092"
environment:
kafka_advertised_listeners: plaintext://localhost:9092
nacos:
image: nacos/nacos-server:v2.2.3
ports:
- "8848:8848"
environment:
mode: standalone
启动命令:docker-compose up -d
优势:团队协作环境一致,ci/cd 可直接复用。
5.内存数据库快速测试
场景:单元测试无需连接真实数据库。
// 测试类配置
@springboottest
@testpropertysource(locations = "classpath:application-test.yml")
public class userservicetest {
// 使用 h2 内存数据库
}
// application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.driver
sql:
init:
mode: always
schema-locations: classpath:schema-h2.sql
四、代码增强与热部署
6.spring boot devtools 热部署
配置:
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-devtools</artifactid>
<optional>true</optional>
</dependency>
特性:
- 自动重启:classpath 文件变动触发应用重启(比冷启动快 80%)
- livereload:浏览器/前端资源自动刷新
- 远程调试:支持远程应用热更新
7.jrebel 商业热部署(终极方案)
优势:真正的热交换,无需重启,支持类结构修改(增删方法、字段)。
使用步骤:
- 安装 idea 插件
- 激活许可证
- 启动时选择 jrebel debug
- 修改代码后 ctrl + shift + f9 编译当前文件即时生效
五、单元测试与 mock
8.spring boot test 最佳实践
@springboottest(webenvironment = webenvironment.random_port)
@autoconfiguremockmvc
class usercontrollertest {
@autowired
private mockmvc mockmvc;
@mockbean
private userservice userservice; // 自动注入 mock 对象
@test
void testgetuser() throws exception {
// 打桩
when(userservice.getuser(1l)).thenreturn(new user("test"));
mockmvc.perform(get("/api/users/{id}", 1l))
.andexpect(status().isok())
.andexpect(jsonpath("$.name").value("test"));
verify(userservice, times(1)).getuser(1l);
}
}
9.mock 中间件(embedded)
@testconfiguration
public class testredisconfig {
@bean
public redisserver redisserver() {
return redisserver.newredisserver().start(); // 嵌入式 redis
}
}
支持组件:
- embedded redis:
com.github.kstyrc:embedded-redis - embedded kafka:
spring-kafka-test - embedded mongodb:
de.flapdoodle.embed:de.flapdoodle.embed.mongo
六、高级调试技巧
10.远程调试(remote debug)
场景:调试部署在测试环境/容器中的应用。
启动 jvm 参数:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar
idea 配置:
- run → edit configurations → + remote jvm debug
- host:
测试服务器ipport:5005 - 点击 debug 图标连接
docker 中开启:
from openjdk:17 expose 5005 cmd ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "app.jar"]
11.jmx 监控与 jvisualvm
启动参数:
-dcom.sun.management.jmxremote -dcom.sun.management.jmxremote.port=9999 -dcom.sun.management.jmxremote.authenticate=false -dcom.sun.management.jmxremote.ssl=false
jvisualvm 连接:jvisualvm → 右键 local → jmx connection → localhost:9999
功能:
- 查看堆内存、线程、类加载
- sampler:cpu/内存采样分析
- profiler:性能剖析
- mbeans:查看 spring beans 状态
12.arthas 线上诊断神器
场景:生产环境无法远程调试,需动态诊断。
安装使用:
curl -o https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar # 选择 java 进程
核心命令:
- watch:查看方法入参/返回值
watch com.example.service.userservice getuser '{params, returnobj}' -x 2 - trace:方法内部调用耗时追踪
trace com.example.service.userservice getuser -n 5 --skipjdkmethod false
- jad:反编译类查看源码
jad com.example.service.userservice
- ognl:执行 spel 表达式(查看/修改字段)
ognl '@com.example.config.globalconfig@static_field'
- dashboard:实时系统监控
七、多线程与异步调试
13.线程 dump 分析
命令行:
# 查看 java 进程 jps # 生成线程 dump jstack <pid> > thread.dump
在线分析:https://fastthread.io/ 或 https://jstack.review/
关键状态:
- blocked:等待锁,需定位死锁
- waiting:等待条件唤醒
- timed_waiting:sleep 或定时等待
14.异步任务调试
@service
public class asyncservice {
@async
public completablefuture<user> asyncgetuser(long id) {
// 断点会命中,但线程名是 task-1/task-2
return completablefuture.completedfuture(usermapper.selectbyid(id));
}
}
idea 调试技巧:
- all:查看所有线程堆栈
- thread:仅查看当前线程(避免断点干扰其他线程)
- mute breakpoints:临时禁用断点,让程序运行到特定位置
八、网络与 http 调试
15.mockserver 模拟外部 api
@beforeeach
void setup() {
mockserver = clientandserver.startclientandserver(1080);
// 配置 mock 响应
mockserver.when(
request()
.withmethod("post")
.withpath("/api/payment")
).respond(
response()
.withstatuscode(200)
.withbody("{\"status\":\"success\"}")
);
}
16.wireshark/tcpdump 抓包分析
# 抓取 8080 端口的 http 请求 sudo tcpdump -i any -w capture.pcap port 8080 # 用 wireshark 打开分析 wireshark capture.pcap
九、专项调试工具
17.内存溢出(oom)分析
启动参数保留堆 dump:
-xx:+heapdumponoutofmemoryerror -xx:heapdumppath=/path/to/dump.hprof -xx:+printgcdetails -xx:+printgcdatestamps -xloggc:/path/to/gc.log
分析工具:
- eclipse mat:分析堆 dump,定位内存泄漏
- jhat:jdk 自带轻量分析
jhat dump.hprof
18.sql 调试
mybatis 日志:
logging:
level:
com.example.mapper: debug # 打印 sql 和参数
p6spy 监控:
<dependency>
<groupid>p6spy</groupid>
<artifactid>p6spy</artifactid>
</dependency>
自动打印 sql 执行时间,识别慢查询。
十、调试效率提升技巧
19.idea 书签与断点技巧
- f11:匿名书签
- ctrl + f11:带数字的书签(1-9)
- ctrl + 1-9:跳转到数字书签
- 断点分组:右键断点 → move to group,管理复杂场景
20.spring boot 调试模式
# 开启 debug 日志 java -jar app.jar --debug # 查看自动配置报告 java -jar app.jar --debug > auto-config-report.txt # 启动时打印 bean 创建过程 -dlogging.level.org.springframework.beans.factory=debug
总结:调试方法论
| 问题类型 | 首选工具 | 备选方案 |
|---|---|---|
| 业务逻辑错误 | idea 断点调试 | 日志 + 单元测试 |
| 环境问题 | docker compose | embedded 组件 |
| 性能问题 | jvisualvm/arthas | jprofiler(商业) |
| 生产问题 | arthas | 远程 debug |
| 并发问题 | jstack + 线程分析 | jmc(java mission control) |
| 内存泄漏 | eclipse mat | jprofiler |
黄金法则:先在单元测试中复现,再用断点/日志定位,最后工具分析。调试是系统性工程,结合多种手段才能事半功倍。
到此这篇关于java后端本地调试实用方法总结大全的文章就介绍到这了,更多相关java后端本地调试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论