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_OPTIMIZATION_GUIDE.md

164 lines
3.9 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 本地内存不足问题解决指南
## 问题分析
### 错误信息
```
Native memory allocation (mmap) failed to map X bytes for G1 virtual space
```
### 根本原因
1. **地址空间冲突**
- Windows 7GB 内存系统,Java Heap 默认占用 2GB
- Compressed Oops 模式将 Heap 放在前 4GB 地址空间
- 本地内存(OpenCV、ONNX、相机库等)也需要地址空间
- 结果:地址空间不足,导致本地内存分配失败
2. **系统配置**
- 总内存:7GB
- Java Heap:2GB
- 剩余:5GB(用于操作系统、其他库、本地内存)
### 受影响的应用
- `yudao-server.jar`
- `LxCameraApi-1.0.1-SNAPSHOT.jar`(加载了 OpenCV、海康相机、ONNX)
## 解决方案
### 关键参数
```bash
# 1. 减小堆内存,为本地内存预留空间
-Xms1g -Xmx2g
# 2. 将 Java Heap 放在 4GB 地址空间以上(最重要!)
-XX:HeapBaseMinAddress=0x100000000
# 3. 增加 JIT 代码缓存
-XX:ReservedCodeCacheSize=512m
# 4. 使用 G1 垃圾回收器
-XX:+UseG1GC
```
### 使用方法
#### 方式 1:直接运行(推荐用于开发测试)
**yudao-server:**
```cmd
cd d:\git\lpNewgit\yudao-server
start.bat
```
**LxCameraApi:**
```cmd
cd d:\git\lpNewgit
LxCameraApi-start.bat
```
**通用模板(适用于其他应用):**
```cmd
cd d:\git\lpNewgit
optimized-jvm-start-template.bat
```
编辑 `optimized-jvm-start-template.bat` 修改:
- `JAR_PATH`:你的 JAR 包路径
- `APP_NAME`:应用名称
- `LOG_PATH`:日志路径
#### 方式 2:作为 Windows 服务运行(推荐用于生产环境)
**yudao-server:**
```cmd
cd d:\git\lpNewgit\yudao-server
install-service.bat
```
**卸载服务:**
```cmd
uninstall-service.bat
```
## 监控和验证
### 检查堆地址
启动后查看日志,确认堆地址已移到 4GB 以上:
```
Heap address: 0x0000000100000000 # 应该是 0x100000000 或更高
```
### 查看崩溃日志
如果仍然崩溃,查看:
```
D:\sy_software\application-app\logs\hs_err_pid*.log
```
### 性能监控
使用以下命令监控内存使用:
```cmd
# 查看 JVM 进程
tasklist | findstr java.exe
# 查看内存使用
wmic process where "name='java.exe'" get ProcessId,WorkingSetSize,PageFileUsage
```
## 其他优化建议
### 1. 如果还有内存问题
进一步减小堆内存:
```bash
-Xms512m -Xmx1.5g
```
### 2. 禁用 JIT 编译(极端情况)
```bash
-Xint
# 这会显著降低性能,但能解决 JIT 相关的内存问题
```
### 3. 增加 Windows 虚拟内存
1. 右键"此电脑" → 属性 → 高级系统设置
2. 性能 → 设置 → 高级 → 虚拟内存
3. 增加页面文件大小到 8GB 或更大
### 4. 升级硬件
最佳解决方案是增加物理内存到 16GB 或更高。
## 常见问题
### Q1: 为什么之前运行正常,现在才崩溃?
A: 应用运行时间越长,内存碎片越严重,最终导致无法分配大块连续内存。
### Q2: 减小堆内存会影响性能吗?
A: 轻微影响,但比崩溃要好。对于 7GB 系统,2GB 堆是合理的平衡点。
### Q3: `-XX:HeapBaseMinAddress` 参数安全吗?
A: 安全。这是官方推荐的解决方案,专门用于解决 Compressed Oops 和本地内存冲突问题。
### Q4: 为什么需要增加 CodeCache?
A: JIT 编译器需要本地内存来存储编译后的代码,增加缓存大小可以减少编译频率。
## 文件说明
- `optimized-jvm-start-template.bat` - 通用 JVM 优化启动模板
- `LxCameraApi-start.bat` - LxCameraApi 专用启动脚本
- `yudao-server/install-service.bat` - yudao-server 服务安装脚本
- `yudao-server/uninstall-service.bat` - 服务卸载脚本
- `yudao-server/start.bat` - yudao-server 直接启动脚本
## 联系支持
如果问题仍然存在,请提供以下信息:
1. `hs_err_pid*.log` 文件内容
2. 应用运行的 JAR 包名称
3. 加载了哪些第三方库(DLL)
4. 系统配置(CPU、内存、Windows 版本)