【问题标题】:Detect when IE11, with its built-in memory leak, runs out of memory (1.5GB recyclable pool)检测内置内存泄漏的 IE11 何时耗尽内存(1.5GB 可回收池)
【发布时间】:2019-07-06 02:15:01
【问题描述】:

IE11 有一个有据可查的 iframe 内存泄漏。在 SPA 中,如果您使用 iframe,内存将增长到大约 1.5GB,之后它会变慢直到崩溃。

我的任务是检测浏览器何时崩溃并尽快重新启动页面。该应用程序是嵌入在 ASP.NET MVC 中的 Vue.JS。

IE11 中的浏览器支持哪些内存/性能检测?

  • 某种使用过的内存度量库?
  • 某种性能测量库?
  • 计算创建的 javascript 对象?
  • 计算已创建的 iframe?

其他想法?谢谢。 :)

来源: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/10186458/ https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8449104/ http://support.sas.com/kb/60/514.html

【问题讨论】:

  • 需要 Chrome 或 Firefox。是的,我知道。
  • "有据可查的 iframe 内存泄漏" - 请您添加指向此文档的链接吗?
  • 添加了文档。

标签: javascript performance vue.js memory-leaks internet-explorer-11


【解决方案1】:

这就是我最终用来检测 IE11 内存不足的方法。

主要思想: 每 1 秒计时一次。如果 1 秒计时器需要 1 分钟,我们就会冻结。

var startTime, endTime;

function start() {
    startTime = new Date();
};

function end() {
    endTime = new Date();
    var timeDiff = endTime - startTime; //in ms
    // strip the ms
    timeDiff /= 1000;

    // get seconds 
    var seconds = Math.round(timeDiff);
    console.log(seconds + " seconds");

    if (seconds > 60)
        console.log("IE11 just froze. We need to refresh.");
}

start();

setInterval(function () {
    end();

    start();
}, 1000);

【讨论】:

  • 您可能希望在选项卡处于非活动状态时停止检查,因为众所周知,浏览器会延迟后台选项卡上的计时器。 (具体IE11我不知道,但是这段代码好像没有做浏览器检测)。
  • 好点!我还没有发布这个进行测试。关于如何知道标签是否处于活动状态的任何提示?
  • 我们只使用 IE11。 :(
  • 请参阅stackoverflow.com/q/1060008/1048572,但您需要弄清楚您需要哪种方式专门用于 IE11。另外this (very old) test 建议 IE 可能根本不会暂停setInterval,所以它可能工作正常,但你应该尝试一下。
  • 我做了一些测试,IE11似乎并不在意。无论如何谢谢! :)
【解决方案2】:

就我在这方面的经验而言,最好的办法是减少 iframe 的重新创建并减少使用的总内存,从而减少泄漏(例如通过代码拆分未使用的代码、删除大型库、等等)。然后,您可以进行测试以估算每次页面加载(或您的情况下的任何相关指标)预计会泄漏多少内存,并提出重新加载应用程序的启发式方法(例如,在 50 个页面加载后)。

请记住,有时重新加载应用程序不会帮助 IE 回收内存。对此有一个奇怪的解决方法 - 您可以打开一个新选项卡,导航到您的应用程序,切换到该选项卡,然后关闭旧选项卡。显然不是理想的用户体验,但它比页面刷新更可靠。

在其他情况下,内存泄漏是因为您从主窗口的某处引用了 iframe,或者在删除 iframe 之前没有清理 iframe 中的事件处理程序 - 我假设您已经从描述中检查了这一点,但是我认为提及它不会有什么坏处:)。

【讨论】:

    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多