火次果
火次果

暂无菜单项

首页/文章/技术文章/web前端/HTML5/
打开 MD 链接

甘特图反复刷新:为什么内存只涨不降

发布于 12小时前
1

数据每次更新就重新调用图表构造函数,页面内存持续上涨,切换几轮后开始卡顿。根因是旧实例没有被释放,新实例又叠加在同一容器上。

笔记本屏幕上显示的多个图表
实例叠加会让内存曲线只升不落

问题写法

function render(data) {
  const chart = anychart.ganttResource();
  chart.data(data);
  chart.container('box').draw();
}

每次调用都新建一个图表对象并绑定容器。旧对象仍持有节点引用与事件监听,垃圾回收无法回收,容器里也会残留多份画布。

正确写法

let chart = null;
function render(data) {
  if (!chart) {
    chart = anychart.ganttResource();
    chart.container('box').draw();
  }
  chart.data(data);
  chart.fitAll();
}

实例只创建一次,后续刷新走数据接口。fitAll 负责按新数据重算视窗,避免时间轴停留在旧范围。

两条补充

  • 容器被整体替换时才需要重建,此时先调用实例自带的销毁方法,再清空容器节点。
  • 定时刷新场景下,上一次绘制未完成时不要发起下一次,用状态位排队。

如何确认泄漏

  1. 在性能面板录制内存,连续刷新若干轮后观察曲线是否回落。
  2. 查看容器里画布节点的数量,持续增长即为实例叠加。
  3. 用堆快照对比前后对象数,筛选图表名下的实例。

取舍

方案 内存表现 适用
复用实例 平稳 常规刷新
销毁后重建 取决于销毁是否彻底 容器结构变化
每次新建 持续增长 不使用

常见问题(FAQ)

复用实例后视图没有更新?
设置数据之后还需要 fitAll 重算视窗,否则时间轴沿用旧范围。
容器被替换还能复用吗?
不能,容器变更后要销毁旧实例再新建,并清空容器节点。
定时刷新会不会叠加请求?
会,需要用状态位控制,上一次绘制完成后再发起下一次。
内存曲线如何判断正常?
刷新后应出现回落,持续走高且不回落即为泄漏。
销毁方法该在什么时机调用?
在卸载容器或切换页面时调用,先销毁再清空节点。
支持作者
如果这篇内容对你有帮助,可以请作者喝杯咖啡
0 点赞
0 收藏
分享
0 讨论
反馈
0 / 600
细中粗
0 讨论
热门最新
总结
暂无总结
嗨,下午好!
所有的成功,都源自一个勇敢的开始
创作
社区
购物
会员
近期热门

暂无数据

火次果
火次果
首页
资迅中心
小店
AI导航
社区
所有的成功,都源自一个勇敢的开始
不辜负每一个勇敢的开始
关于FAQ协议
火次果 © 2026鲁ICP备2025164830号-1