# Java调试技巧

# 日志使用

# 最佳实践

  1. 日志级别使用

    • ERROR:系统错误和异常
    • WARN:潜在问题警告
    • INFO:重要业务事件
    • DEBUG:调试信息
    • TRACE:详细跟踪信息
  2. 日志内容规范

    • 包含时间戳
    • 记录线程信息
    • 保留调用堆栈
    • 添加业务标识
  3. 使用MDC记录追踪信息

public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        try {
            MDC.put("requestId", UUID.randomUUID().toString());
            MDC.put("userId", getCurrentUserId());
            chain.doFilter(request, response);
        } finally {
            MDC.clear();
        }
    }
}
  1. 日志配置示例
<!-- logback-spring.xml -->
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{requestId}] - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

# 常用工具

  1. Logback

    • 配置灵活
    • 性能优秀
    • 自动重载配置
    • 支持多种输出格式
  2. Log4j2

    • 异步日志
    • 性能更好
    • 支持Lambda表达式
    • 插件化架构
  3. ELK日志分析

    • Elasticsearch存储日志
    • Logstash收集日志
    • Kibana可视化分析
    • 支持复杂查询

# 远程调试

# 配置方法

  1. JVM参数设置
# 启动时添加以下参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  1. IDE配置

    • 创建远程调试配置
    • 设置断点
    • 连接远程JVM
    • 开始调试
  2. 防火墙配置

    • 开放调试端口
    • 设置访问控制
    • 配置安全组
    • 限制IP访问

# 注意事项

  1. 安全考虑

    • 仅在测试环境使用
    • 设置访问IP白名单
    • 使用SSH隧道
    • 及时关闭调试端口
  2. 性能影响

    • 避免在生产环境使用
    • 控制调试会话数量
    • 设置超时时间
    • 注意网络带宽消耗
  3. 调试技巧

    • 使用条件断点
    • 查看线程堆栈
    • 评估表达式
    • 动态修改变量

# 性能分析

# JVM工具

  1. jstack

    • 查看线程状态
    • 分析死锁
    • 查看线程堆栈
    • 诊断性能问题
  2. jmap

    • 生成堆转储
    • 查看内存占用
    • 分析对象分布
    • 检查内存泄漏
  3. jstat

    • 监控GC活动
    • 查看类加载
    • 分析编译统计
    • 查看内存池状态

# 性能分析工具

  1. Arthas

    • 线程分析
    • 类加载分析
    • 方法追踪
    • 性能火焰图
  2. JProfiler

    • CPU分析
    • 内存分析
    • 线程分析
    • SQL分析
  3. VisualVM

    • 实时监控
    • CPU分析
    • 内存分析
    • 线程分析