代码之家  ›  专栏  ›  技术社区  ›  Edza

检测IE11及其内置内存泄漏何时耗尽内存(1.5GB可回收池)

  •  4
  • Edza  · 技术社区  · 6 年前

    ie11有一个记录良好的iframe内存泄漏。在spa中,如果您使用iframes,内存将增长到大约1.5gb,然后它将减慢速度,直到崩溃。

    我的任务是检测浏览器何时即将崩溃,并尽快重新启动页面。应用程序是嵌入在asp.net mvc中的vue.js。

    IE11浏览器中提供了哪种内存/性能检测?

    • 某种用过的内存度量库?
    • 某种性能度量库?
    • 统计创建的javascript对象?
    • 计算生成的iframes?

    其他想法?谢谢。:)

    资料来源: 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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Joru    6 年前

    就我的经验而言,减少这种情况的最佳方法是减少iframe的重新创建,并减少使用的总内存,这样泄漏就很小(例如,通过拆分未使用的代码、删除大型库等)。然后,您可以做一个测试来估计每次页面加载时您希望泄漏多少内存(或者您的情况中的任何相关度量),并提出一个启发式方法来重新加载应用程序(例如,在50页加载之后)。

    请记住,有时重新加载应用程序将无助于ie回收内存。有一个奇怪的解决方法-你可以打开一个新的标签,导航到你的应用程序,切换到那个标签,并关闭旧的标签。显然不是一个理想的用户体验,但它比页面刷新更可靠。

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

        2
  •  0
  •   Edza    6 年前

    这就是我最后用来检测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);