阅读:4676回复:15
FF似乎用得稍久就不能开about:memory了(发现是一个GM脚本搞的)
最近FF用得比较久之后就会很卡,本来想开about:memory看看是不是那个扩展内存泄露了,结果就看到一行报错:
[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIMemoryMultiReporter.collectReports]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome://global/content/aboutMemory.js :: processMemoryReporters :: line 213" data: no] 这太蠢了! 这几天重复试了几下,基本只有FF刚开的时候还能看about:memory,用得稍久后就一定会报这个错了。 这到底是什么奇怪的bug…… |
|
1楼#
发布于:2013-12-27 11:22
我用UC脚本查看内存
图片:QQ截图20131227112311.png // ==UserScript== // @name MemoryMonitorMod.uc.js // @compatibility Firefox 9.* // @description Bei Ueberschreitung der maximalen Speicherauslastung kann automatischer Neustart durchgefuehrt werden // @include main // @note Bezug: about:memory // @note http://loda.jp/script/?id=584 // @note Version auf https://github.com/ardiman/userChrome.js um _autoRestart und Fehlerumgehung bei gfx-surface-image ergaenzt // ==/UserScript== const version = Services.prefs.getCharPref("extensions.lastPlatformVersion").split(".",1); var ucjs_MemoryMonitor = { // ---------------------------------setting data----------------------------- // Update-Intervall[ms] _interval: 5000, // Neustart bei maximaler Speichernutzung (Achtung! Anpassen an die darunter gewaehlte Speichereinheit) _maxMemory: 500, // Speicher-Einheit: B, KB, KiB, MB, MiB, GB, GiB _prefix: "MB", // Speicher-Einheitanzeige in der Statusbar _dPrefix: true, // automatischen Restart bei Ueberschreitung von _maxMemory durchfuehren _autoRestart: false, // -------------------------------------------------------------------------- interval: null, init: function () { var memoryPanel = document.createElement("statusbarpanel"); memoryPanel.id = "MemoryDisplay"; memoryPanel.setAttribute("label", this.setPrefix(this._dPrefix)); document.getElementById("urlbar-icons").insertBefore(memoryPanel, null); this.start(); this.interval = setInterval(this.start, this._interval); }, addFigure: function (str) { var num = new String(str).replace(/,/g, ""); while (num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2"))); return num; }, restart: function () { var appStartup = Components.interfaces.nsIAppStartup; Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit); }, getSize: function (mem, flag) { var pre = 1; switch (this._prefix) { case 'KB': pre = 1000; break; case 'KiB': pre = 1024; break; case 'MB': pre= 1000 * 1000; break; case 'MiB': pre = 1024 * 1024; break; case 'GB': pre = 1000 * 1000 * 1000; break; case 'GiB': pre = 1024 * 1024 * 1024; break; } if (flag) return mem * pre; else return ucjs_MemoryMonitor.addFigure(Math.round(mem / pre)); }, setPrefix: function (flag) { return (flag) ? " " + this._prefix : ""; }, start: function () { try { const Cc = Components.classes; const Ci = Components.interfaces; var mgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager); var e = mgr.enumerateReporters(); var gMemReporters = {}; if(version<=25){ while (e.hasMoreElements()) { var mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter); gMemReporters[mr.path] = mr;} } if(version>25){ var handleReport = function(Process, Path, Kind, Units, Amount, Description) { gMemReporters[Path] = {}; gMemReporters[Path].amount = Amount; } var MEM_HISTOGRAMS = {}; while (e.hasMoreElements()) { let mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter); MEM_HISTOGRAMS[mr.name] = mr.name; if(!MEM_HISTOGRAMS[mr.name] || ["resident","private","gfx-surface-image"].indexOf(mr.name)==-1) continue; try{ mr.collectReports(handleReport, null); }catch(ex){} } } var workingSet = gMemReporters["resident"].amount; var commitmentSize=(typeof(gMemReporters["private"])!="undefined" ? gMemReporters["private"].amount : 0); var gfxImage=(typeof(gMemReporters["gfx-surface-image"])!="undefined" ? gMemReporters["gfx-surface-image"].amount : 0); var restartMemory = ucjs_MemoryMonitor.getSize(ucjs_MemoryMonitor._maxMemory, true); var memoryPanel = document.getElementById("MemoryDisplay"); memoryPanel.setAttribute("label", ucjs_MemoryMonitor.getSize(workingSet) + ucjs_MemoryMonitor.setPrefix(ucjs_MemoryMonitor._dPrefix)); memoryPanel.setAttribute("onclick", "openUILinkIn('about:memory','tab')"); memoryPanel.setAttribute("tooltiptext", ((workingSet) ? "resident: " + ucjs_MemoryMonitor.getSize(workingSet) + " " + ucjs_MemoryMonitor._prefix + "\n" : "") + ((commitmentSize) ? "private: " + ucjs_MemoryMonitor.getSize(commitmentSize) + " " + ucjs_MemoryMonitor._prefix + "\n" : "") + ((gfxImage) ? "gfx-surface-image: " + ucjs_MemoryMonitor.getSize(gfxImage) + " " + ucjs_MemoryMonitor._prefix : "") ); if (workingSet > restartMemory) { if (memoryPanel.style.backgroundColor == "red" && ucjs_MemoryMonitor._autoRestart) ucjs_MemoryMonitor.restart(); else memoryPanel.style.backgroundColor = "red"; } else if (workingSet > restartMemory * 0.8) memoryPanel.style.backgroundColor = "#FF99FF"; else if (workingSet > restartMemory * 0.6) memoryPanel.style.backgroundColor = "#FFFF99"; else memoryPanel.style.backgroundColor = "transparent"; } catch (e) { clearInterval(ucjs_MemoryMonitor.interval); alert("ucjs_MemoryMonitor Err:" + e); } } } ucjs_MemoryMonitor.init(); |
|
|
2楼#
发布于:2013-12-22 07:53
pcxfirefox:你确定哪个版本没问题,哪个版本开始出现的问题吗?我希望解决这个问题回到原帖21有这个问题,20没有。 这个问题和沙盒的名字有关,greasemonkey会用脚本的名字创建一个沙盒,这个过程会造成内存泄漏。 https://bugzilla.mozilla.org/show_bug.cgi?id=875348 这是bugzilla上面的相关报告。 |
|
3楼#
发布于:2013-12-17 22:58
|
|
|
4楼#
发布于:2013-05-12 11:28
|
|
|
5楼#
发布于:2013-05-12 11:28
|
|
6楼#
发布于:2013-05-12 11:28
aurora正常,那应该下一个beta版本会解决
|
|
|
7楼#
发布于:2013-05-12 11:28
重新测试了一下,发现这个bug比想象中的还要蠢。是中文脚本名的问题。如果GM脚本的脚本名中带有中文就能引发这个bug。
这应该是FF beta的一个bug,在stable下面都无法复现。 |
|
8楼#
发布于:2013-05-12 11:28
Re: FF似乎用得稍久就不能开about:memory了……
starrin:……排查出来了。是新浪微博上的那个GM脚本,“眼不见心不烦”。 我没装那个脚本。但装了另一个GM脚本,一生效运行这about就会开始报错了,然后过一段时间(几十秒,大概是自动垃圾清理了)这就恢复了。 用的Greasemonkey 1.8,Firefox 21。看来可能Greasemonkey或者Firefox的bug,像是兼容性问题,收集信息出错了。 |
|
9楼#
发布于:2013-05-12 11:28
嗯,脚本问题的话最好回报给作者。
|
|
|
10楼#
发布于:2013-05-12 11:28
据说是有的脚本导致GM内存泄漏出现的这个情况
|
|
|
11楼#
发布于:2013-05-12 11:28
Re: FF似乎用得稍久就不能开about:memory了……
……排查出来了。是新浪微博上的那个GM脚本,“眼不见心不烦”。我是不太明白为什么一个GM脚本能造成FF本身的BUG啦…… 刚才为了确认,我专门新建了一个profile,只装了Greasemonkey,然后去装了这个脚本,开一下新浪微博,刷新一下about:memory,就出现报错了。 |
|
12楼#
发布于:2013-05-12 11:28
Re: FF似乎用得稍久就不能开about:memory了……
我新建了一个profile之后确实没有这个问题了,看来需要排查我原来装的那一堆扩展……唉。 |
|
13楼#
发布于:2013-05-12 11:28
|
|
14楼#
发布于:2013-05-12 11:28
Re: FF似乎用得稍久就不能开about:memory了……
用22.0a开了一个半小时,about:memory 一直都正常打开。 |
|
|
上一页
下一页