ERP/MEMORY_OPTIMIZATION.md

161 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 内存优化说明
## 优化内容
### 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. 切换到其他页面,确认定时器已停止