当我连续数小时/数天在 Google Chrome 中打开多个标签时,我发现有些页面最终会占用大量 RAM,甚至整个操作系统 (XP) 都会因分页而失去响应。如果我运气好,我终于可以将打开的 URL 列表添加到书签中,关闭 Chrome,然后重新启动;如果我运气不好,我只能关闭 Chrome,并希望能够恢复打开的 URL 列表。
- 这是为什么?插件内存泄漏?
- 有没有办法配置 Chrome,以便单个标签/页面不会使用超过设定数量的 RAM?
谢谢。
答案1
我认为你应该选择购买操作系统可以处理的内存。你不应该限制 Chrome 的内存使用量,因为这只会破坏你的网络冲浪体验。假设你大部分时间都使用电脑上网,你应该让 Chrome 获取所需的所有资源,以便提供你想要的性能,让你“享受”同时运行这些标签。
我认为没有办法限制每个选项卡的 RAM 使用量,但你可以完全限制 Chrome 的使用量。看这里:
https://stackoverflow.com/questions/192876/set-windows-process-or-user-memory-limit
如果我是你,如果我想要顺畅的网上冲浪,我宁愿不这么做。
答案2
我编写了一个 Python 2.5 程序,当 chrome 渲染器使用的内存超过一定数量时,它会终止渲染器。我在 下运行这个程序
watch
。(请注意,它使用了psutilPython 中未包含的模块。)import sys, os, psutil if len(sys.argv) == 2: try: limit = int(sys.argv[1]) except: limit = 200 # default 200MB else: limit = 200 uid = os.getuid() for p in psutil.get_process_list(): try: if (p.name == 'chrome' and any('type=renderer' in part for part in p.cmdline) and p.uid == uid): m = p.get_memory_info() #print p.pid,m, m.rss / 1024 / 1024, m.vms / 1024 / 1024 if (m.rss / 1024 / 1024) > limit: # kill if rss is greater than limit print 'Killed', p.pid p.kill() except psutil.error.NoSuchProcess: pass except psutil.error.AccessDenied: pass
我依靠会话好友当 Chrome 无法恢复打开的标签页时恢复它们。
答案3
到目前为止,我见过的唯一能做到这一点的是在容器内运行 chrome和限制容器内存。
然而这也有一些重要的警告,
dockerize 的设置和启动顺序使得 chrome 的运行变得复杂
首先,Chrome 已经使用内核容器来沙盒化其线程;因此您必须使用某种允许其工作的 root 权限来运行容器。这可以规避,而链接容器模型就是这样做的。(它几乎可以完成它需要做的一切)
你几乎肯定会失去 GPU 加速
让音频工作起来很复杂,但可以在链接容器模型中处理。
不管你认为当你的保修失效时还会出现什么问题,Chrome 都非常讨厌被告知不要使用更多内存,并且会因此而发脾气。
但它最终确实起作用了。
我更感兴趣的是将这些 RAM 限制应用于没有预先构建的 docker 镜像来为您整理的 Electron Shell 应用程序。
离题了,但我想指出的是,Firefox 在有限的硬件上表现非常好,但我不认为这是一个真正的答案。
答案4
它不一定是插件。请注意,网页不再是静态的。一些网页只是有大量的异步活动在进行。加上插件中的活动,你就会得到一些未知数。
我发现最好的补救措施是关闭网页并重新加载。据我所知,没有办法限制网页使用的 RAM 量。