# Linux查看Java进程内存
ps aux | grep java
# 查看详细内存信息
jmap -heap <pid>
# 查看对象统计
jmap -histo:live <pid> | head -20
application-dev.ymlapplication.ymlVehicleGpsSegmentMileageServiceImpl.java - 分批处理+ThreadLocalGpsSyncTask.java - 资源显式释放application-dev.yml - Druid连接池优化application.yml - Redis连接池优化# 执行索引优化脚本
mysql -u root -p 966120 < sql/optimize_memory_indexes.sql
# 查看执行结果
# 确认所有索引创建成功
编辑启动脚本 ry.bat 或 ry.sh:bash java -jar \ -Xms512m -Xmx1024m -Xmn256m \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=logs/heapdump.hprof \ ruoyi-admin.jar
# 停止应用
./ry.sh stop
# 启动应用
./ry.sh start
# 查看启动日志
tail -f logs/sys-info.log
# 测试GPS分段计算定时任务
访问: http://localhost:8080/monitor/job
找到 "vehicleGpsSegmentMileageTask" 任务
点击 "执行一次" 按钮
# 观察日志
tail -f logs/sys-info.log | grep "批次.*完成"
预期结果: 批次 1-10/50 处理完成,已建议JVM回收内存 批次 11-20/50 处理完成,已建议JVM回收内存 ... 批量分段里程计算完成 - 总车辆数: 50, 成功: 48, 失败: 2
访问: http://localhost:8080/druid/index.html
用户名: ruoyi
密码: 123456
重点关注:
- Active连接数 < 10
- Idle连接数 < 5
- Wait Thread Count = 0
# 查看实时内存使用
jstat -gcutil <pid> 1000 10
# 预期结果
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 15.50 45.23 28.67 95.12 92.45 15 0.156 0 0.000 0.156
-- 执行前记录时间
SET @start = NOW();
SELECT vehicle_id
FROM tb_vehicle_gps
WHERE collect_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY vehicle_id;
-- 查看执行时间
SELECT TIMESTAMPDIFF(MICROSECOND, @start, NOW())/1000 as '耗时(毫秒)';
预期结果:
- 优化前: 2000-5000ms
- 优化后: 100-500ms (提升80%+)
| 指标 | 优化前 | 优化后目标 | 当前值 |
|---|---|---|---|
| 空闲内存占用 | ~350MB | ~180MB | _______ |
| GPS批量计算峰值 | ~800MB | ~200MB | _______ |
| 连接池空闲占用 | ~80MB | ~50MB | _______ |
| Full GC次数/小时 | 10-15次 | 2-5次 | _______ |
| GPS查询耗时 | 2-5秒 | 0.1-0.5秒 | _______ |
# 1小时内的内存变化监控
watch -n 60 "jstat -gcutil <pid>"
# 查看GC日志
tail -f logs/gc.log
# 监控内存优化日志
tail -f logs/sys-info.log | grep -E "批次|建议JVM回收"
原因: JVM预分配内存机制
解决: 观察30分钟后的稳定值
检查:
```bash
jmap -heap | grep -E "MaxHeapSize|NewSize"
### Q3: 索引创建失败?
**可能原因**:
- 索引名称已存在
- 表结构不匹配
**解决**:
-- 查看现有索引
SHOW INDEX FROM tb_vehicle_gps;
-- 如果存在,先删除再创建
DROP INDEX idx_vehicle_collect_time ON tb_vehicle_gps;
```
调整BATCH_SIZE:java // VehicleGpsSegmentMileageServiceImpl.java private static final int BATCH_SIZE = 15; // 从10调整为15
# 使用Git回滚
git checkout HEAD~1 -- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java
git checkout HEAD~1 -- ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/GpsSyncTask.java
# application-dev.yml
minIdle: 10 # 改回10
maxEvictableIdleTimeMillis: 900000 # 改回900000
# application.yml
redis:
lettuce:
pool:
min-idle: 0 # 改回0
max-active: 8 # 改回8
-- 执行 sql/optimize_memory_indexes.sql 底部的回滚脚本
| 项目 | 实施日期 | 实施人 | 结果 | 备注 |
|---|---|---|---|---|
| 代码优化 | _________ | _______ | ☐ 成功 ☐ 失败 | _____ |
| 数据库索引 | _________ | _______ | ☐ 成功 ☐ 失败 | _____ |
| JVM参数调整 | _________ | _______ | ☐ 成功 ☐ 失败 | _____ |
| 验证测试 | _________ | _______ | ☐ 通过 ☐ 不通过 | _____ |
测试时间: _________________
测试场景: GPS分段计算100辆车
| 指标 | 优化前 | 优化后 | 提升比例 |
|---|---|---|---|
| 执行时间 | _______ | _______ | _______ |
| 内存峰值 | _______ | _______ | _______ |
| Full GC次数 | _______ | _______ | _______ |
满足以下3个条件即为优化成功:
如遇问题,请提供以下信息:
1. 堆转储文件 (heapdump.hprof)
2. GC日志 (gc.log)
3. 应用日志 (sys-info.log)
4. 错误堆栈
检查清单版本: v1.0
创建时间: 2026-01-12
维护人: Qoder AI Assistant