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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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