ERP/MEMORY_OPTIMIZATION.md

161 lines
3.9 KiB
Markdown
Raw Normal View History

# 内存优化说明
## 优化内容
### 1. Dashboard 组件资源清理
**清理策略(三重保护):**
- **策略1**: 每5次更新清理一次约50秒
- **策略2**: 数据量超过500条时自动清理
- **策略3**: 超过1分钟强制清理
**清理内容:**
- 拼多多和圆通审计数据缓存
- Canvas 画布内容
- 趋势图数据对象
- 触发浏览器垃圾回收(如果支持)
**数据过滤:**
- 只缓存最近30天的数据
- 自动过滤超过30天的旧数据
- 减少内存占用
**日志输出:**
```javascript
console.log('[资源清理] 清理缓存数据,更新次数:', count, '数据量:', pddLength, ytLength);
```
### 2. Upload 组件事件监听器管理
**问题:**
- 每次渲染页面都添加新的事件监听器
- 旧的监听器没有被移除
- 导致内存泄漏
**解决方案:**
- 创建统一的事件监听器管理系统
- 使用 `addListener()` 替代 `addEventListener()`
- 页面切换时自动清理所有监听器
**实现:**
```javascript
const eventListeners = [];
const addListener = (element, event, handler) => {
if(element){
element.addEventListener(event, handler);
eventListeners.push({element, event, handler});
}
};
const cleanupListeners = () => {
eventListeners.forEach(({element, event, handler}) => {
element.removeEventListener(event, handler);
});
eventListeners.length = 0;
};
```
### 3. 内存监控工具
**功能:**
- 实时监控 JavaScript 堆内存使用情况
- 每10秒输出一次内存状态
- 内存使用超过70%时发出警告
**使用方法:**
```javascript
// 开发环境自动启动
// 生产环境手动启动
MemoryMonitor.start(10000); // 每10秒监控
// 查看当前内存状态
MemoryMonitor.logCurrent();
// 停止监控
MemoryMonitor.stop();
```
**输出示例:**
```
[内存监控] 使用: 45.23 MB / 2048.00 MB (2.21%)
[内存警告] 内存使用率超过70%,建议清理资源
```
## 监控方法
### 浏览器开发者工具
1. **打开控制台**F12 → Console
2. **查看内存日志**
- `[资源清理]` - 缓存清理日志
- `[内存监控]` - 内存使用情况
- `[内存警告]` - 内存使用过高警告
3. **性能监控**F12 → Performance
- 点击 Record 开始录制
- 使用应用一段时间
- 停止录制查看内存曲线
4. **内存快照**F12 → Memory
- 选择 Heap snapshot
- 拍摄快照对比内存变化
### 手动测试
```javascript
// 在控制台执行
MemoryMonitor.logCurrent();
// 查看缓存状态
console.log('Dashboard缓存:', window.__auditCache);
// 查看定时器
console.log('定时器ID:', window.__auditTimer);
```
## 预期效果
### 优化前
- 内存持续增长
- 30秒清理无明显效果
- 长时间使用后内存占用过高
### 优化后
- 内存使用稳定在合理范围
- 每50秒或数据量达到500条时自动清理
- 超过1分钟强制清理
- 只保留最近30天数据
- 事件监听器正确清理
## 注意事项
1. **浏览器支持**
- `performance.memory` API 仅在 Chrome/Edge 中可用
- Firefox/Safari 不支持此 API
2. **垃圾回收**
- `window.gc()` 需要浏览器启动时添加 `--js-flags="--expose-gc"` 参数
- 正常情况下浏览器会自动进行垃圾回收
3. **开发环境**
- 内存监控工具在 localhost 自动启动
- 生产环境需要手动启动
## 调整参数
如需调整清理策略,修改 `frontend/js/components/dashboard.js`
```javascript
// 修改清理条件
const shouldClean = cache.updateCount >= 5 || // 改为10次
(cache.pdd && cache.pdd.length > 500) || // 改为1000条
(now - cache.lastClean > 60000); // 改为1200002分钟
```
## 测试建议
1. 打开浏览器控制台
2. 进入 Dashboard 页面
3. 观察内存监控日志
4. 等待约1分钟查看清理日志
5. 切换到其他页面,确认定时器已停止