google-chrome - Chromium 本机内存增长(通过图像缓存?)
问题描述
我的单页 Web 应用程序在 Linux 上使用 Chromium 时遇到了内存泄漏情况。我的应用程序获取 html 标记并通过.innerHTML将其嵌入到主页中。远程 html 片段可能引用 jpgs 或 pngs。JS-heap 中不会发生内存泄漏。这可以在下表中看到。
A 列显示了由performance.memory.usedJSHeapSize报告的 JS 堆的大小。(我使用-enable-precise-memory-info参数运行 Chromium 以获得精确值。)
B 列显示了 Chromium 占用的内存总量,如顶部所示(仅采样了开始值和结束值)。
C 列显示了 /proc/meminfo 报告的 Linux 中“可用内存”的数量。
A B C
01 1337628 234.5 MB 522964 KB
02 1372198 499404 KB
03 1500304 499864 KB
04 1568540 485476 KB
05 1651320 478048 KB
06 1718846 489684 KB GC
07 1300169 450240 KB
08 1394914 475624 KB
09 1462320 472540 KB
10 1516964 471064 KB
11 1644589 459604 KB GC
12 1287521 441532 KB
13 1446901 449220 KB
14 1580417 436504 KB
15 1690518 457488 KB
16 1772467 444216 KB GC
17 1261924 418896 KB
18 1329657 439252 KB
19 1403951 436028 KB
20 1498403 434292 KB
21 1607942 429272 KB GC
22 1298138 403828 KB
23 1402844 412368 KB
24 1498350 412560 KB
25 1570854 409912 KB
26 1639122 419268 KB
27 1715667 399460 KB GC
28 1327934 379188 KB
29 1438188 417764 KB
30 1499364 401160 KB
31 1646557 406020 KB
32 1720947 402000 KB GC
33 1369626 283.3 MB 378324 KB
虽然在我的 33 步测试期间 JS 堆仅在 1.3 MB 和 1.8 MB 之间变化,但 Chromium 内存(如顶部所报告)增长了 48.8 MB(从 234.5 MB 到 283.3 MB)。根据 /proc/meminfo 的说法,“可用内存”甚至同时缩小了 145 MB(从 C 列的 522964 KB 到 378324 KB)。我假设 Chromium 占用了报告的 283.3 MB之外的大量缓存。请注意,我通过开发人员工具手动调用 GC 6 次。
在运行测试之前,我已经停止了所有不必要的服务并杀死了所有不需要的进程。没有其他代码在并行执行任何必要的工作。没有浏览器扩展,也没有其他打开的选项卡。
内存泄漏似乎在本机内存中,并且可能涉及正在显示的图像。他们似乎永远不会被释放。此问题似乎类似于1 (bugs.webkit.org)。我已经应用了此处列出的所有常用建议2。如果我继续运行应用程序,Chromium 占用的内存量将无限增长,直到一切都变得爬行或直到 Linux OOM 杀手来袭。我能做的一件事(在为时已晚之前)是将浏览器切换到不同的 URL。这将释放所有本机内存,然后我可以返回我的应用程序并继续使用全新的内存情况。但这不是一个真正的解决方案。
问:本机内存缓存能否以更加程序化的方式释放?
解决方案
推荐阅读
- mapbox - Mapbox 总是两次访问驱动程序位置以进行往返
- java - 无法从 WSDL url wsimport
- bash - 无法使用 bash 脚本设置 gcloud 项目
- python - 如果任何列值不在熊猫列表中,则删除组
- redux - 除了样板减少之外,使用 createSlice() 而不是 createReducer() 是否有任何特定的使用优势/劣势
- javascript - 如何在按钮单击时在表格的 td 中获取输入值
- c++ - 为什么使用迭代器和范围的斐波那契数列会抛出错误
- javascript - 如何在Datatables jquery的columns.render函数中传递多个参数?
- javascript - 如何从redis键值获取数据并推送到数组?
- node.js - 如何向 Discord API 发出 HTTP 请求?