# 内存优化说明 ## 优化内容 ### 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); // 改为120000(2分钟) ``` ## 测试建议 1. 打开浏览器控制台 2. 进入 Dashboard 页面 3. 观察内存监控日志 4. 等待约1分钟查看清理日志 5. 切换到其他页面,确认定时器已停止