You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yudao/JVM_CRASH_FIX.md

2.3 KiB

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 查询

搜索项目中可能存在的复杂查询:

grep -r "last(" --include="*.java" | head -20

优化数据库查询

  • 避免使用 last() 方法
  • 使用分页查询代替 limit 1
  • 添加适当的索引

减少 MyBatis Plus 的复杂查询

// 不推荐
.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. 紧急方案(如果必须立即运行)

使用解释模式(不推荐,性能很差)

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 查询语句示例