# autotune_java **Repository Path**: shilei-wang/autotune_java ## Basic Information - **Project Name**: autotune_java - **Description**: Java应用堆栈、GC日志和上下文切换情况自动分析工具 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-10-30 - **Last Updated**: 2025-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HygonJDK 调优助手 一个自动化Java性能分析工具,简化HygonJDK调优过程,提供专业的性能分析和优化建议。 ## 🚀 快速开始 ### 一键分析所有Java进程 ```bash python3 autotune_analyzer.py --all ``` ### 单独分析特定功能 #### 线程堆栈分析 (jstack) ```bash # 自动选择第一个Java进程 python3 autotune_analyzer.py --jstack # 指定特定PID python3 autotune_analyzer.py --jstack --pid ``` #### GC日志分析 ```bash # 分析指定GC日志文件 python3 autotune_analyzer.py --gc --gc-file # 生成并分析示例GC日志 python3 autotune_analyzer.py --generate-gc ``` #### 上下文切换分析 ```bash # 自动采集并分析上下文切换数据 python3 autotune_analyzer.py --context --collect-perf 10 # 分析已有的perf数据文件 python3 autotune_analyzer.py --context --perf-file ``` ## 📊 实际分析示例 ### 示例分析报告 (PID=2716624) ``` ====================================================================== HygonJDK 调优助手 - 线程堆栈分析报告 ====================================================================== --- 1. 死锁分析 --- [正常] 未检测到Java级别死锁。 --- 2. 线程状态概览 --- 总线程数: 635 - WAITING (parking): 142 (22.4%) - RUNNABLE : 174 (27.4%) - WAITING : 71 (11.2%) - TIMED_WAITING : 77 (12.1%) - TIMED_WAITING (parking): 137 (21.6%) - UNKNOWN : 34 (5.4%) --- 3. CPU 消耗排行 (Top 5) --- 1. "C2 CompilerThread0" - 14079.29 ms (状态: RUNNABLE) 2. "VM Thread" - 4977.50 ms (状态: UNKNOWN) 3. "GC Thread#31" - 2509.67 ms (状态: UNKNOWN) 4. "GC Thread#2" - 2509.49 ms (状态: UNKNOWN) 5. "GC Thread#6" - 2508.55 ms (状态: UNKNOWN) --- 4. 锁竞争分析 (synchronized & JUC) --- [注意] 共检测到 279 个线程处于锁等待状态。 按锁聚合 (Top 5 竞争最激烈的锁): 1. 锁: 0x0000000a819dae80 持有者: ForkJoinPool 线程池 (等待工作队列) 等待线程数: 12 等待者: Group8.Backend.beJVM{Tier3}.1, Group8.Backend.beJVM{Tier3}.2, Group8.Backend.beJVM{Tier3}.3... 2. 锁: 0x0000000a819bcda0 持有者: Condition (等待条件信号) 等待线程数: 2 等待者: Heartbeat: Group8.Backend.beJVM.heartbeat.1, Heartbeat: Group8.Backend.beJVM.heartbeat.2 3. 锁: 0x00000009c0016060 持有者: CountDownLatch (等待计数器归零) 等待线程数: 1 等待者: main 4. 锁: 0x0000000bd633ccc0 持有者: 未知 (JUC 锁) 等待线程数: 1 等待者: Grizzly-worker(1) 5. 锁: 0x00000009c012e100 持有者: ForkJoinPool 线程池 (等待工作队列) 等待线程数: 1 等待者: TransferLogsSenderAgent.1 ====================================================================== ``` ## 🎯 基于分析结果的优化建议 ### 关键性能问题识别 1. **锁竞争严重** - 279个线程处于锁等待状态(占总线程44%) 2. **GC压力较大** - GC线程CPU消耗较高(2500+ms) 3. **JIT编译热点** - C2 CompilerThread0 CPU消耗最高(14,079ms) ### 立即实施的优化(低风险) ```bash # 添加以下JVM参数: -XX:ParallelGCThreads=8 -XX:MaxGCPauseMillis=200 -XX:+UseAdaptiveSizePolicy -Djava.util.concurrent.ForkJoinPool.common.parallelism=8 ``` ### 进阶优化(中风险) ```bash # 如果阶段1效果不明显,尝试: -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=45 -XX:ReservedCodeCacheSize=256m ``` ### 预期改善效果 - **锁等待减少**: 20-30% - **GC暂停时间**: 减少30-50% - **GC线程CPU**: 降低40-60% - **整体吞吐量**: 提升10-20% ## 📈 功能特性 ### ✅ 自动进程发现 - 自动查找所有Java进程PID - 显示进程命令行参数 - 支持选择特定进程分析 ### ✅ 智能线程堆栈分析 - **死锁检测** - 自动识别Java级别死锁,支持多种死锁模式检测 - **线程状态统计** - 详细的状态分布分析 - **CPU消耗排行** - 识别CPU热点线程 - **锁竞争分析** - 智能识别JUC锁类型和持有者 - 支持15+种JUC锁类型识别(ReentrantLock、ReadWriteLock、Semaphore等) - 锁类型分布统计和彩色显示 - 准确的锁持有者信息显示 - 锁竞争热点识别 ### ✅ GC日志分析 - **Full GC检测和统计** - 精确识别Full GC及其触发原因 - **STW暂停时间分析** - 详细暂停时间统计和性能评估 - **GC类型分布分析** - Young GC、Full GC等类型分布统计 - **内存使用分析** - 内存回收效率、最大内存使用量分析 - **GC吞吐量分析** - GC时间占比计算和性能评估 - **智能优化建议** - 基于GC表现提供针对性优化建议 ### ✅ 上下文切换分析 - 自动perf数据采集 - 主动/被动切换识别 - 线程切换频率统计 - 性能瓶颈识别 ## 🔧 使用场景 ### 场景1:快速诊断系统问题 ```bash # 一键分析所有Java进程 python3 autotune_analyzer.py --all ``` ### 场景2:针对特定应用调优 ```bash # 找到目标进程PID python3 autotune_analyzer.py --jstack # 分析该进程的线程状态 python3 autotune_analyzer.py --jstack --pid 2716624 # 分析GC性能 python3 autotune_analyzer.py --gc --gc-file /path/to/gc.log ``` ### 场景3:性能基准测试 ```bash # 采集10秒上下文切换数据 python3 autotune_analyzer.py --context --collect-perf 10 # 分析线程堆栈 python3 autotune_analyzer.py --jstack # 生成GC基准数据 python3 autotune_analyzer.py --generate-gc ``` ## 🎯 简化优势 ### 相比手动操作: - ❌ 手动执行 `pgrep java` + `jstack -l ` - ❌ 手动分析jstack输出 - ❌ 手动解析GC日志 - ❌ 手动执行perf命令 ### 现在只需: - ✅ 一个命令完成所有分析 - ✅ 自动进程发现和选择 - ✅ 专业分析报告输出 - ✅ 智能锁类型识别 - ✅ 性能优化建议 ## 📝 技术特性 ### 智能锁分析 - **JUC锁类型识别**: 支持15+种JUC锁类型识别(ReentrantLock、ReadWriteLock、Semaphore、CountDownLatch等) - **锁特性分析**: 公平锁/非公平锁、读锁/写锁等特性识别 - **锁持有者推断**: 基于Locked ownable synchronizers信息 - **竞争热点识别**: 按等待线程数排序显示 - **死锁检测**: 自动识别Java级别死锁,支持多种死锁模式 ### 彩色输出 - **严重问题**: 🔴 红色标记 - **警告信息**: 🟡 黄色标记 - **正常状态**: 🟢 绿色标记 - **信息提示**: 🔵 蓝色标记 ## ⚠️ 注意事项 1. **权限要求**: - jstack分析:需要Java进程访问权限 - perf分析:需要sudo权限执行perf命令 2. **文件路径**: - GC日志:支持相对路径和绝对路径 - perf数据:自动生成或手动指定 3. **输出格式**: - 彩色终端输出 - 结构化分析报告 - 性能问题标记(严重/警告/正常) ## ⚠️ 重要安全提示 ### OOM(内存不足)问题说明 在分析过程中如果出现Java进程被OOM killer杀死的情况,**这不是分析工具的直接原因**,而是系统内存配置问题: **根本原因**: - Java进程内存配置过高(如 -Xms89g -Xmx89g) - 系统物理内存不足 - 多个大内存进程同时运行 **解决方案**: 1. 合理配置Java进程内存大小 2. 避免在内存紧张时执行分析 3. 分批分析,不要同时分析所有进程 详细解决方案请参考:[内存优化指南](MEMORY_OPTIMIZATION.md) ### 安全使用建议 ```bash # 分析前检查系统内存 free -h # 如果内存充足再执行分析 python3 autotune_analyzer.py --jstack --pid ``` ## 🆘 故障排除 ### 常见问题: 1. **找不到Java进程**:确保Java进程正在运行 2. **权限不足**:使用sudo执行或检查文件权限 3. **perf命令失败**:需要安装perf工具和内核调试符号 4. **OOM问题**:参考内存优化指南调整配置 ### 获取帮助: ```bash python3 autotune_analyzer.py --help ``` ## 📚 相关文档 - [性能优化建议](PERFORMANCE_OPTIMIZATION.md) - 详细的优化实施指南 - [内存优化指南](MEMORY_OPTIMIZATION.md) - OOM问题解决方案 - [快速使用指南](QUICK_START_ZH.md) - 中文快速入门 ## 🔍 死锁检测功能 ### 功能特性 - **自动死锁检测**: 自动识别Java级别的死锁 - **多种死锁模式支持**: 支持synchronized和JUC锁的死锁检测 - **详细死锁信息**: 显示死锁涉及的线程和锁资源 - **智能分析**: 基于jstack输出进行精确的死锁识别 ### 支持的锁类型 - **synchronized锁**: 传统的Java内置锁 - **ReentrantLock**: 可重入锁(公平/非公平) - **ReadWriteLock**: 读写锁 - **CountDownLatch**: 计数器锁 - **Semaphore**: 信号量 - **Condition**: 条件变量 - 以及其他JUC锁类型 ### 使用示例 ```bash # 自动检测所有Java进程的死锁 python3 autotune_analyzer.py --jstack # 检测指定进程的死锁 python3 autotune_analyzer.py --jstack --pid ``` ### 检测结果示例 ``` --- 1. 死锁分析 --- [严重] 检测到 1 个Java级别死锁!请立即在日志中搜索 'Found ... deadlock'。 ``` --- *HygonJDK 调优助手 - 让Java性能调优更简单、更智能*