ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Twenty 内存越跑越高?用 DevTools 快照对比三步锁定泄漏源头

Twenty 内存越跑越高?用 DevTools 快照对比三步锁定泄漏源头 Twenty 内存越跑越高用 DevTools 快照对比三步锁定泄漏源头【免费下载链接】twentyThe open alternative to Salesforce, designed for AI.项目地址: https://gitcode.com/GitHub_Trending/tw/twentyTwenty 的 CRM 页面开着开着就卡任务管理器里它的内存条蹭蹭往上涨关掉弹层也不回落。这篇文章带你用 Chrome DevTools 的 Memory 面板做 Twenty 内存泄漏排查录一次分配、对比两次快照把泄漏源头锁定到具体模块。先搞清 Twenty 的内存卡在哪内存泄漏说白了就是对象没人用了引用却还在GC 收不走。Twenty 是重前端架构packages/twenty-front/src/modules/ 下五十来个模块Jotai 状态、SSE 订阅、命令菜单常驻内存AI 与工作流模块又会在长任务里持续产生对象。所以前端用 DevTools 查服务端缓存侧靠监控确认这里只讲浏览器里的那一半。动手前30秒把工具备齐拉取 Twenty 源码git clone https://gitcode.com/GitHub_Trending/tw/twenty按项目文档把 Twenty 跑起来浏览器里能正常登录并打开 CRM 页面页面按F12或CtrlShiftI打开 Chrome DevTools切到Memory面板确认页面处于日常真实使用状态有视图、有工作流记录、AI 功能可用上图排查前确认 Twenty 应用正常运行、功能可触达设置页 Webhook 测试界面实操从按下录制键到锁定嫌疑对象用 Allocation Sampling 抓一轮分配Memory 面板顶部分类下拉里选Allocation sampling点Record去 Twenty 里走一遍日常动线切对象视图、筛选数据、触发一次 AI 功能约 1-2 分钟回来点Stop看采样表里Bytes最高的几条调用栈。如果大头集中在业务模块的某个函数上泄漏嫌疑基本就在它那一片如果大头是框架内部如 React Fiber说明是业务代码持有了框架对象不放继续往下查。按 Retained Size 排序揪出大头分类改选Heap snapshot点Take heap snapshot作为基线此刻页面刚打开、尽量干净再做一轮操作回到 Memory 面板点Garbage collect按钮触发一次 GC再拍第二张快照在对象列表的Retained Size列上点一下排序从大到小看Retained 值大且带closure/Fiber/ 定时器回调特征的节点就是你的一号嫌疑人。注意单看绝对值意义不大一张快照只能说明现在大不能说明在涨。对比两次快照确认只涨不跌打开第二张快照上方显示模式下选Comparison对比对象选第一张基线只看Delta为正的对象按 Delta 排序如果某类对象闭包、Fiber、SSE 回调、定时回调在两轮操作间只增不减大概率就是泄漏如果 Delta 基本持平那只是正常缓存不用慌。上图Twenty 应用内界面示例——这类视图页面就是内存快照对比时的操作对象排查清单4种最高频的泄漏源头泄漏类型你看到的现象去哪找项目内模块怎么修隐式全局变量快照里window子树挂着业务对象packages/twenty-front/src/modules/browser-event赋值前补上const/let声明定时器残留快照反复出现setTimeout/setInterval回调packages/twenty-front/src/modules/ai、packages/twenty-front/src/modules/sse-db-event清理函数里clearInterval事件监听未成对移除#listeners里同名 handler 越积越多packages/twenty-front/src/modules/keyboard-shortcut-menu、packages/twenty-front/src/modules/side-paneladdEventListener和removeEventListener配对缓存只进不出服务端内存缓涨、对象量平稳上升packages/twenty-server/src/engine/core-entity-cache、packages/twenty-server/src/engine/workspace-cache给缓存补 TTL 或容量上限// 错误忘声明的赋值挂到 window 上 function tick() { pending fetchNext(); } // 正确const pending 卸载时 clearInterval(timer)让内存占用长期不超标给前端缓存和实体缓存设过期时间或容量上限别让 map 无限长大组件卸载时把定时器和事件监听一起摘掉和挂载逻辑写在同一处AI 长任务的结果用完就解绑别挂在页面级长生命周期对象上关键模块改动后重跑一遍本文的快照对比Delta 为正就停手修掉 ⚡SSE 订阅随视图生命周期创建和销毁切走视图时确认订阅被取消一轮采样→快照→对比十几分钟就能跑完胜在便宜、可复现比对着日志猜强得多。明天打开 Twenty把这篇的三步走一遍——如果 Delta 里揪出了闭包直接顺着它去 packages/twenty-front/src/modules/ 里查谁没放手。【免费下载链接】twentyThe open alternative to Salesforce, designed for AI.项目地址: https://gitcode.com/GitHub_Trending/tw/twenty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表