# JVM 崩溃问题解决方案 ## 问题分析 JVM 崩溃发生在 JIT 编译线程中,编译 JSQLParser 时失败。 ## 解决方案 ### 1. 使用优化后的启动脚本 已创建 `start.bat`,包含优化的 JVM 参数: - 堆内存:2G-4G(适应7G系统内存) - 元空间:256M-512M - JIT 代码缓存:256M - 使用 G1 垃圾回收器 - 启用堆转储和错误日志 ### 2. 如果问题仍然存在,尝试以下方案 #### 方案 A:禁用特定方法的 JIT 编译 在 start.bat 的 JAVA_OPTS 中添加: ``` -XX:CompileCommand=exclude,net/sf/jsqlparser/parser/CCJSqlParser,jj_3R_Alias_2314_5_165 ``` #### 方案 B:使用 C2 编译器(性能更好,但内存占用更大) ``` -XX:+TieredCompilation -XX:TieredStopAtLevel=4 ``` #### 方案 C:减少堆内存,增加系统内存 如果系统其他进程占用较多内存,调整: ``` -Xms1g -Xmx3g ``` ### 3. 代码优化建议 #### 检查复杂 SQL 查询 搜索项目中可能存在的复杂查询: ```bash grep -r "last(" --include="*.java" | head -20 ``` #### 优化数据库查询 - 避免使用 `last()` 方法 - 使用分页查询代替 `limit 1` - 添加适当的索引 #### 减少 MyBatis Plus 的复杂查询 ```java // 不推荐 .last("limit 1") // 推荐 .last("LIMIT 1") // 或者使用分页 .last("limit 1").orderByDesc("create_time") ``` ### 4. 监控和诊断 #### 启用 GC 日志 在 start.bat 的 JAVA_OPTS 中添加: ``` -Xloggc:logs/gc.log ^ -XX:+PrintGCDetails ^ -XX:+PrintGCDateStamps ``` #### 监控内存使用 使用工具: - JConsole - VisualVM - JProfiler ### 5. 紧急方案(如果必须立即运行) #### 使用解释模式(不推荐,性能很差) ```bash java -Xint -jar yudao-server.jar ``` #### 限制 JIT 编译线程数 ``` -XX:CICompilerCount=2 ``` ## 长期优化建议 1. **升级硬件** - 增加系统内存到至少 16GB - 推荐配置:32GB 内存 + 4 核心 CPU 2. **优化应用架构** - 分离数据库和应用服务器 - 使用微服务架构 - 减少单个应用的复杂度 3. **定期维护** - 清理日志文件 - 定期重启应用 - 监控内存使用情况 ## 联系方式 如果问题仍然存在,请提供: 1. 完整的 hs_err_pid.log 文件 2. 应用日志(logs 目录) 3. SQL 查询语句示例