我们使用ajax接收后台的监控数据,在前台显示,大概2秒一次访问,发现ie的内存有波动,但总体上一直在向上涨。
写了个简单的测试程序
var testCB = function(){
   var a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
for(var i = 0 ; i < 100000; i++){
   testCB();
}在ie空白页下按“F12”,弹出开发人员工具,在脚本的控制台下贴上代码,运行几次,就发现ie的内存长了几十k,也不会减下来。虽然这个只有几十k,但当监控数据数量大的时候,涨的就更多了。在我们的环境里,当ie内存涨到1.4G时,ie就会挂了。好像是ie有内存使用限制?有没有这方面有经验的朋友指引下:
1:是不是有方法能使上面的程序不内存泄露。
2:ie是不是有内存使用限制,是不是能提高限制。

解决方案 »

  1.   

    这个是经典的IE6/7 伪内存泄露,刷新就可以消除,或换IE9试一下。
    刷新无效是IE6/7的垃圾收集器算法BUG,这个可以改变写法解决。最好的办法还是放弃IE6
      

  2.   

    多谢 ftiger提点,好像一般的监控程序,都是刷新页面以刷新数据显示。可我们的程序是内嵌3D内容,刷新页面3D要重新加载,会等不少时间,所以不能刷新页面,呵呵。
    另外,我现在一般在IE8和9上跑,还是会有内存涨的现象。
    如果内存涨没有办法,那能不能提高IE内存使用的限制呢,好像是当IE涨到1.4G时,系统就挂了。IE是不是有内存使用限制,是不是能提高限制。
      

  3.   

    以上代码逻辑上不会泄露内存,可以在函数执行后主动回收内存试试
    for(var i = 0 ; i < 100000; i++){
       testCB();
       CollectGarbage();
    }至于绘图的内存增长,多半就是内存泄露了,打开任务管理器,把gdi对象列显示出来,看看ie的gdi数量是否一直在增长,若你的程序逻辑不会一直增加图形,而事实上gdi一直增加,说明必然有内存泄露
      

  4.   

    楼主的那种写法只能等gc回收,页面内存泄露还是要找到原因,释放内存,IE的内存限制再大也会用完的。。
    var testCB = function(){
       var a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"function test(){
    //如果这里使用了a就会闭包,内存就会一直增大  
    }}
    for(var i = 0 ; i < 100000; i++){
       testCB();
    }
    将a定义为全局变量这样就行var a;
    var testCB = function(){
       a = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    }
    for(var i = 0 ; i < 100000; i++){
       testCB();
    }
      

  5.   

    2秒一次不如改用comet的长连接模式,做个隐藏的iframe,与服务器连接不会中断的,服务器一有数据就向这个连接写入
    <script>
      parent.doSomething(date)
    </script>
    因为不用不停的建立ajax,内存应当增长比较慢。这也是一种即时聊天的方案。
    另外3D是IE ONLY?
      

  6.   

    3D我们用的是我们自己用C++开发的activeX,能保证内存泄露的问题,主要跑在IE上,其他浏览器虽然能做支持,但还没做太多,呵呵。
    页面自己的泄露问题,看了各位老大的指点很有启发,我做些测试再和大家讨论
      

  7.   


    这个是正解,你定义了100000个变量,每个变量都占用内存空间,内存占有率肯定增长,可以在变量使用完成后,用变量=undefined 来释放内存,在net、java中不需要对变量释放,是因为有垃圾回收机制帮你回收释放了,在javascript中,可没有人帮你回收。