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