魔鬼的梦魇—验证IE中的js内存泄露模式(三)

按照Justin Rogers文章的顺序,接下来的这个模式应该是跨页内存泄露模式(cross-page leak),但是由于这个模式产生的中间对象,我们并不能访问到,所以我也想不到好的有可视效果的验证方式,所以就不介绍了,有兴趣的话大家可以看一下原文;今天简单的来学习这篇文章的最后一个模式Pesudo-Leak。

很多时候一些API运行的时候的实际行为和被期望的行为会导致你无法断定内存泄露的存在。Pseudo-leak几乎总是出现在进行动态脚本操作的同个页面内,并且当导航到一个空白页面后就很难察觉到泄露。我们需要做的就是怎样断定其不是跨页内存泄露,然后检测内存的消耗是否跟预期的相符。我们将会重写script文本标签作为验证这个模式的例子。

就像DOM的插入循序导致的问题一样,这个泄露模式也是由于创建的临时对象导致的泄露。通过一次又一次的重写一个script标签内部的文本,这样将会导致很多泄露的js对象被绑定到先前的内容中。

Justin Rogers在这个模式中给出的例子如下,我们同样也无法测试泄露的存在。

<html>

<head>
        <script language="JScript">

function LeakMemory()
        {
            // Do it a lot, look at Task Manager for memory response

for(i = 0; i < 5000; i++)
            {
                hostElement.text = "function foo() { }";
            }
        }
        </script>
    </head>

<body>
        <button onclick="LeakMemory()">Memory Leaking Insert</button>
        <script id="hostElement">function foo() { }</script>
    </body>
</html>

根据以上代码,我也写了一个测试例子,当第一次遍历覆盖script标签内容的时候,我们声明了一个数组,并将0压入数组,以后每次遍历都将相应的循环变量的值压入数组,最后我们输出数组的所有元素。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script id ="hostElement"></script>
    <script type="text/javascript">
        var PseudoLeakTester = {
            leak: function () {
                this.makeLeak();
                this.showLeakObject();
            }
            ,
            makeLeak: function () {
                for (var i = 0; i < 10; i++) {
                    if (i == 0) {
                        hostElement.text = "var testArray = new Array();  testArray.push(0)";
                    }
                    else {
                        hostElement.text = "testArray.push(" + i + ")";
                    }
                }
            }
            ,
            showLeakObject: function () {
                alert(testArray.toString());
            }
        };

PseudoLeakTester.leak();
    </script>
</head>
<body>

</body>
</html>

运行的效果图如下。

图 1. 泄露验证例子运行输出结果

魔鬼的梦魇—验证IE中的js内存泄露模式(三)相关推荐

  1. 梦魇java_[Java教程]魔鬼的梦魇—验证IE中的JS内存泄露模式(一)

    [Java教程]魔鬼的梦魇-验证IE中的JS内存泄露模式(一) 0 2012-05-08 07:00:04 随着移动互联网的发展,现在越来越多的应用开始想bs方向转移,原来很多复杂的计算逻辑也自然随着 ...

  2. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

    js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...

  3. 哪些操作会造成内存泄漏及Js内存泄露解决方法

    1.垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量.如果一个对象的 引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的 内存即可回收 2.setTim ...

  4. java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作

    垃圾回收原理和算法 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可 垃圾回 ...

  5. Android开发中常见的内存泄露案例以及解决方法总结

    Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...

  6. Android中常见的内存泄露

    内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏.内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会 ...

  7. JavaScript 中的内存泄露模式

    JavaScript 是用来向 Web 页面添加动态内容的一种功能强大的脚本语言.它尤其特别有助于一些日常任务,比如验证密码和创建动态菜单组件.JavaScript 易学易用,但却很容易在某些浏览器中 ...

  8. node.js 内存泄露问题之解决

    因项目需要,要借用node.js 作为 js引擎,解析动态生成的 js 语句,并将结果返回给调用者.因此,基于nodes.js ,实现了一个简单的 httpserver,针对请求,生成动态js 语句, ...

  9. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

最新文章

  1. 全网唯一一个可以复现成功的光流计算项目
  2. 【错误记录】Android Studio 的 Flutter 代码界面没有 Logcat 面板
  3. 机器学习-Random Forest算法简介
  4. C++类、函数、指针
  5. 微信小程序微商城(十):用户收货地址管理
  6. report 和report on的区别
  7. 机器学习建模商务合作
  8. 尚学堂马士兵SSH笔记下载
  9. 曙光计算机能玩游戏吗,曙光英雄怎么在电脑上玩 用模拟器玩曙光英雄电脑版...
  10. 产品经理面试,说一下你是怎么做产品规划的?
  11. 在三角形中rt是什么意思_什么叫Rt三角形
  12. 【转】宽带路由器应用(三)—ARP欺骗防护功能的使用
  13. spring-cloud(十一)GateWay强大的路由谓词(断言)功能
  14. 双11还没买过瘾?亚马逊“真黑五”全球狂欢登场
  15. Allegro如何添加泪滴操作指导
  16. 你关心的2023年PMP的考试时间和地点在这里
  17. pc模式 华为mate30_华为Mate30系列10个隐藏黑科技
  18. 问渠那得清如许,唯有源头活水来
  19. App Store 的起源,居然来自一本杂志?
  20. 【JHM1400】电阻桥式或半桥式传感器信号调理模块例程

热门文章

  1. php登录实现session记住密码,利用php实现一周之内自动登录存储机制(cookie、session、localStorage)...
  2. php 保护变量,PHP安全:变量的前世今生
  3. java中选择结构有哪些_Java中的选择结构
  4. Example-Based Facial Rigging
  5. ubuntu查看安装软件的版本
  6. Dropout抑制过拟合
  7. oracle的 客户端工具,Oracle SQL Handler下载-Oracle数据库客户端工具5.2 官方版-东坡下载...
  8. html5向上向下兼容插件,Sticky Header-兼容IE8的页面顶部固定jQuery插件
  9. 火灾火焰检测数据集和yolov4检测模型
  10. 特征工程(三):特征缩放,从词袋到 TF-IDF