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

109 lines
2.3 KiB
Markdown

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