想做的页面是读取扫描器扫描的图片,通过setInterva方法去反复调用读取图片的function(这个函数已实现)函数,然后动态添加节点放图片,可是setInterva反复调用函数会非常消耗内存,所以导致out of memory问题,希望大神们给点意见,新手……想要实现的效果是:扫描器扫一张,页面加一张图片,但是这个不可能,只希望做到扫描器扫3张,页面加三张。只限jsp中操作,无任何后台。函数

解决方案 »

  1.   

    设置1s后调用
    --------------------------------------------
    停止计时器
    向后台发异步请求
    --------------------------------------------
    请求成功回调,新建DOM,加载节点
    全部完成后再次启用定时器你是这么做的吗?
      

  2.   

    虚拟机的内存是4GB,图片统一显示为100px,因为setInterva调用的方法会一直排队等待执行,所以会越来越多,我是这么理解的。
      

  3.   

    设置1s后调用
    --------------------------------------------
    停止计时器
    向后台发异步请求
    --------------------------------------------
    请求成功回调,新建DOM,加载节点
    全部完成后再次启用定时器你是这么做的吗? 什么叫像后台发异步请求,没有任何后台代码,只是单纯的jsp页面,就是独立与项目的单独访问的jsp页面。 而且所读取的图片是本地图片,不是项目中的,一天一个人可以扫描一万多张不为过吧。
      

  4.   

    设置1s后调用
    --------------------------------------------
    停止计时器
    向后台发异步请求
    --------------------------------------------
    请求成功回调,新建DOM,加载节点
    全部完成后再次启用定时器你是这么做的吗? 什么叫像后台发异步请求,没有任何后台代码,只是单纯的jsp页面,就是独立与项目的单独访问的jsp页面。 而且所读取的图片是本地图片,不是项目中的,一天一个人可以扫描一万多张不为过吧。
    相对于javascript称为前端
    你jsp不算是后台吗。。你不是AJAX请求获取图片地址然后新建<img src="imgaddress" /> 这样的DOM节点吗
      

  5.   

    用setTimeout代替setInterval
    http://www.cnblogs.com/rainman/archive/2008/12/26/1363321.html
      

  6.   

    设置1s后调用
    --------------------------------------------
    停止计时器
    向后台发异步请求
    --------------------------------------------
    请求成功回调,新建DOM,加载节点
    全部完成后再次启用定时器你是这么做的吗? 什么叫像后台发异步请求,没有任何后台代码,只是单纯的jsp页面,就是独立与项目的单独访问的jsp页面。 而且所读取的图片是本地图片,不是项目中的,一天一个人可以扫描一万多张不为过吧。
    相对于javascript称为前端
    你jsp不算是后台吗。。你不是AJAX请求获取图片地址然后新建<img src="imgaddress" /> 这样的DOM节点吗只有javascript和jsp,得到图片的方法是一个控件,这个没关系,我的理解是:读取图片,显示图片方法的时间应该是大于1秒的,setInterva的间隔时间是1秒,他不管方法有没有执行完,他只是再次调用,所以读取图片,显示图片方法会一直排队等待执行,刚开始只是速度变慢,再过一会就会出现内存溢出问题了。
      

  7.   

    我也想过,但是有个问题是setTimeout无法实现,比如说刚开始访问时如果没有图片,我就不执行读取图片,显示图片的方法,但是setTimeout要想重复执行就得放到读取图片,显示图片的方法的方法中,所以一旦刚开始图片是空的就没法继续下去了,再者setTimeout也会有溢出,今天在网上看到的
      

  8.   

    设置1s后调用
    --------------------------------------------
    停止计时器
    向后台发异步请求
    --------------------------------------------
    请求成功回调,新建DOM,加载节点
    全部完成后再次启用定时器你是这么做的吗? 什么叫像后台发异步请求,没有任何后台代码,只是单纯的jsp页面,就是独立与项目的单独访问的jsp页面。 而且所读取的图片是本地图片,不是项目中的,一天一个人可以扫描一万多张不为过吧。
    相对于javascript称为前端
    你jsp不算是后台吗。。你不是AJAX请求获取图片地址然后新建<img src="imgaddress" /> 这样的DOM节点吗只有javascript和jsp,得到图片的方法是一个控件,这个没关系,我的理解是:读取图片,显示图片方法的时间应该是大于1秒的,setInterva的间隔时间是1秒,他不管方法有没有执行完,他只是再次调用,所以读取图片,显示图片方法会一直排队等待执行,刚开始只是速度变慢,再过一会就会出现内存溢出问题了。
    呵呵,原来你都明白原因了,那就直接换成setTimeout再试试吧
      

  9.   

    setTimeout可以保证上次函数执行完成后,间断1秒,再进行下次函数调用,如果这也溢出,说明是你函数本身执行就溢出了,不关定时器的事情。
    setInterval是不论上次函数有无执行完,中断1秒后执行下次函数,是不能保证线程执行顺序的。
      

  10.   

    再者说,setTimeout和setInterval有本质的结构性的区别,一看就知道为什么setTimeout能保证执行的顺序。
    //setTimeout
    var st = setTimeout(function(){
          console.log("do something big");//函数主体
          st = setTimeout(arguments.callee,1000)//下次执行
    },1000)
    //setInterval
    var st = setInterval(function(){
       console.log("do something big")
    },1000)
      

  11.   

     我先试试吧 希望有用 谢谢 我只能说这个setTimeout也有溢出
      

  12.   

    那我觉得要从你函数执行着手检查,去掉定时器,就执行一次你的操作,检查下是否会慢,如果不会慢或者溢出,说明可能每次执行都有一定溢出,setTimeout进行累加执行后,就会到达顶值,从而溢出。
    或者写下伪码说明你要做的是什么操作,会不会有大量dom节点添加?让有心人帮你猜猜原因,你上面的扫描一万张什么的,没人知道你要做什么的。
      

  13.   

    虚拟机的内存是4GB,图片统一显示为100px,因为setInterva调用的方法会一直排队等待执行,所以会越来越多,我是这么理解的。[/quote
    溢出不会和 settimeout  或者 setInterva 本身有关系直接上代码
      

  14.   

    我已经把用于dom的东西用完后赋值为null了,浏览器会自动去重复使用,dom usage是重复利用的 我已经通过SIEve验证过了
      

  15.   

    虚拟机的内存是4GB,图片统一显示为100px,因为setInterva调用的方法会一直排队等待执行,所以会越来越多,我是这么理解的。[/quote
    溢出不会和 settimeout  或者 setInterva 本身有关系直接上代码不好意思 企业项目 代码得有所保密 不能公开
      

  16.   

    不知道的执行函数怎么写的,可以给一个思路你读取图片的那个应该是通过jsp来获取的吧?那可以参考一下下面这个做法试试(只是猜测,看不到你的代码):   var xmlHttpRequest;  //XmlHttpRequest对象   
        function createXmlHttpRequest(){   
            if(window.ActiveXObject){ //如果是IE
                return new ActiveXObject("Microsoft.XMLHTTP");   
            }else if(window.XMLHttpRequest){ //非IE浏览器   
                return new XMLHttpRequest();   
            }   
        }   
        function onSaomiao(){   
            var url = "读取扫描图片的url地址";
            //1.创建XMLHttpRequest组建   
            xmlHttpRequest = createXmlHttpRequest();   
               
            //2.设置回调函数   
            xmlHttpRequest.onreadystatechange = huidiaofun;   
               
            //3.初始化XMLHttpRequest组建   
            xmlHttpRequest.open("post",url,true);   
               
            //4.发送请求   
            xmlHttpRequest.send(null);     
        }        
        //回调函数   
        function huidiaofun(){   
            if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
                var b = xmlHttpRequest.responseText;
                st = setTimeout("onSaomiao()",1000)
            }   
        }  var st = setTimeout("onSaomiao()",1000)只是大概写的,你自己调试调试看
      

  17.   


    "通过setInterva方法去反复调用读取图片",你页面那不是有很多 图片了,你是IE6?我以前在IE6下碰过太频繁加过载生成DOM产生这样提示
    你可以所当前的 显示打印的内容拼好HTML,一下 innerHTML进去,把原来的内容冲掉
      

  18.   

    恩 谢谢 读取本地图片的方法是一个写好的控件  我只是调用 然后去显示 关键问题就在重复调用 和图片资料过多 也就是dangt片超过400张的时候就会出现内存溢出
      

  19.   

    试试上面的思路,还可以利用里面的状态以及返回值做一些处理的这个大量dom节点我已经做了相应处理 他的值已经在0和固定数值来回变化 已测试
      

  20.   


    "通过setInterva方法去反复调用读取图片",你页面那不是有很多 图片了,你是IE6?我以前在IE6下碰过太频繁加过载生成DOM产生这样提示
    你可以所当前的 显示打印的内容拼好HTML,一下 innerHTML进去,把原来的内容冲掉我用的ie7 恩 我用的是 var thumImg=document.createElement("img"); //放缩略图
        var thumnaDiv=document.createElement("div"); //放缩略图名字
        thum.setAttribute("id","thumdiv");
        thumImg.setAttribute("id","thumImg");
        thumnaDiv.setAttribute("id","thumnaDiv");
        $("#thumImgs").find("img").css("border","0"); //把img标签的红框清空
            thumnaDiv.innerText=getpicName(srcpath,"1"); //缩略图的名字
            thumImg.src=srcpath; 这样的方法添加节点的  再次添加时会清空跟节点下的东西 
      

  21.   

    那你改下生成HTML试试,
    你调用 setInterval(CollectGarbage, 10000); 这命令 清一下内存
      

  22.   


    "通过setInterva方法去反复调用读取图片",你页面那不是有很多 图片了,你是IE6?我以前在IE6下碰过太频繁加过载生成DOM产生这样提示
    你可以所当前的 显示打印的内容拼好HTML,一下 innerHTML进去,把原来的内容冲掉我用的ie7 恩 我用的是 var thumImg=document.createElement("img"); //放缩略图
        var thumnaDiv=document.createElement("div"); //放缩略图名字
        thum.setAttribute("id","thumdiv");
        thumImg.setAttribute("id","thumImg");
        thumnaDiv.setAttribute("id","thumnaDiv");
        $("#thumImgs").find("img").css("border","0"); //把img标签的红框清空
            thumnaDiv.innerText=getpicName(srcpath,"1"); //缩略图的名字
            thumImg.src=srcpath; 这样的方法添加节点的  再次添加时会清空跟节点下的东西 
    这部分简单点,直接拼接图片的<img src="" border=0>这样的用innerHTML插入
      

  23.   


    "通过setInterva方法去反复调用读取图片",你页面那不是有很多 图片了,你是IE6?我以前在IE6下碰过太频繁加过载生成DOM产生这样提示
    你可以所当前的 显示打印的内容拼好HTML,一下 innerHTML进去,把原来的内容冲掉我用的ie7 恩 我用的是 var thumImg=document.createElement("img"); //放缩略图
        var thumnaDiv=document.createElement("div"); //放缩略图名字
        thum.setAttribute("id","thumdiv");
        thumImg.setAttribute("id","thumImg");
        thumnaDiv.setAttribute("id","thumnaDiv");
        $("#thumImgs").find("img").css("border","0"); //把img标签的红框清空
            thumnaDiv.innerText=getpicName(srcpath,"1"); //缩略图的名字
            thumImg.src=srcpath; 这样的方法添加节点的  再次添加时会清空跟节点下的东西 
    这部分简单点,直接拼接图片的<img src="" border=0>这样的用innerHTML插入总体来说我觉得是图片资源过大引起的,在牛的浏览器也不能加载400多张甚至一万张图片吧
      

  24.   

    settimeout就是执行完上个再执行下个 但是我试了 还是溢出 我现在是觉得图片资源过大是最主要的问题