|
|
|
|
|
# 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 版本)
|