xmlhttp对象如何释放 求指点下

Devin.qu 2016-09-08 11:12:23
做了一个小项目,运行时发现 开发板的内存,在打开网页进行交互后在减小,开始以为后台写的C代码有问题,经过一步步排查,现在可以肯定C代码没有内存泄露,问题就出在前端。代码如下
setTimeout("testFun()", 1000);
function testFun()
{

var url = "";
url += '../cgi-bin/Http.cgi';
url += '?';
url += '1' + "," + Math.random();
var xmlhttp = null;

if(window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
else{
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}

xmlhttp.onreadystatechange = function(){

if((xmlhttp.readyState == 4) && (xmlhttp.status == 200))
{
$("h1").text(xmlhttp.responseText);
}
}

xmlhttp.open("GET", url, false);
xmlhttp.setRequestHeader('If-Modified-Since', '0');
xmlhttp.send();


xmlhttp = null; //这里把它指空没用

setTimeout("testFun()", 1000);
}
...全文
455 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Devin.qu 2016-09-12
  • 打赏
  • 举报
回复
我程序运行20次 正好减少12k的内存 应该就是这个响应头部的大小 谁知道这个头部怎么释放么
Devin.qu 2016-09-12
  • 打赏
  • 举报
回复
谢谢各位的回复,你们说的方,法很多我都尝试过,我用一个压力测试和分段测试发现问题出在xmlhttp.send(null);这一句上(并且是12k 12k的往下吃内存),我是这样测试的: 第一步:测试xmlhttp对象创建是否占用内存,测试代码如下:
function testFun()
			{
				var url = "";
				var xmlhttp = null;
				
				if(window.XMLHttpRequest) {
					xmlhttp = new XMLHttpRequest();
					//$("h1").text(xmlhttp + "*" +Math.random());
				}
				else{
					xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
				}

setTimeout(testFun, 10);
}

setTimeout(testFun, 1000);
经过测试在不断创建局部xmlhttp不会对内存有任何影响。xmlhttp 不用使用delete 第二部:测试 xmlhttp.open("GET", url, true); 打开连接是否占用内存,测试代码:

function testFun()
			{
				var url = "";
				var xmlhttp = null;
				
				if(window.XMLHttpRequest) {
					xmlhttp = new XMLHttpRequest();
					//$("h1").text(xmlhttp + "*" +Math.random());
				}
				else{
					xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
				}
	xmlhttp.open("GET", url, true);	
setTimeout(testFun, 10);
}

setTimeout(testFun, 1000);
测试结果,不断的打开链接,不会对内存造成影响。 第三步:发送 send请求,代码如下:
function testFun()
			{
				var url = "";
				var xmlhttp = null;
				
				if(window.XMLHttpRequest) {
					xmlhttp = new XMLHttpRequest();
					//$("h1").text(xmlhttp + "*" +Math.random());
				}
				else{
					xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
				}
	xmlhttp.open("GET", url, true);	
       xmlhttp.send(null);	//此句导致内存泄露
setTimeout(testFun, 10);
}

setTimeout(testFun, 1000);
发现内存在减少并且,是以12k的大小在减少(一段时间)。 我所尝试的解决方法:
function testFun()
			{
				var url = "";
				//url += '../cgi-bin/getDataFromHttp.cgi';
				//url += '?';
				//url += '1' + "," + Math.random();
				var xmlhttp = null;
				
				if(window.XMLHttpRequest) {
					xmlhttp = new XMLHttpRequest();
					//$("h1").text(xmlhttp + "*" +Math.random());
				}
				else{
					xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
				}
				
				xmlhttp.onreadystatechange = function(){
					if(xmlhttp.readyState == 1)	//open
					{
						$("h1").text(xmlhttp.readyState + "*" +Math.random());
					}
					else if(xmlhttp.readyState == 2) //send
					{
						$("h2").text(xmlhttp.readyState + "*" +Math.random());
						
						$("h3").text(xmlhttp.readyState + "*" +Math.random());
					//	xmlhttp.abort();     不能解决问题
						//xmlhttp = null;     不能解决问题
					//	$("h4").text(XMLHttpRequest + "*" +Math.random());
						
					//	delete xmlhttp;    不能解决问题
					}
					
					//
					
				}
				
				xmlhttp.open("GET", url, true);	
				xmlhttp.setRequestHeader('If-Modified-Since', '0');
				xmlhttp.send(null);	//此句导致内存泄露
				//xmlhttp = null;     不能解决问题
			
				setTimeout(testFun, 10);
				
			}
			setTimeout(testFun, 1000);
以上代码都可以大家都可以测试,看看send问题到底怎么解决,我还在尝试,谢谢大家了。
阿志2 2016-09-11
  • 打赏
  • 举报
回复
定义一个全局变量 xhr. 每次调用都会重新对这个变量赋值。全部调用完后 用 delete(xhr); 就可以了。
hookee 2016-09-11
  • 打赏
  • 举报
回复
1 window.XMLHTTP 是全局的, 变量=null 没用。 2 不用 setTimeout 触发 setTimeout ,而是在 onreadystatechange 回调函数的 xmlhttp.readyState == 4 分支里 触发 setTimeout,保证前一次调用已经完成 。
hyurl 2016-09-10
  • 打赏
  • 举报
回复
你没必要一直创建新对象啊,直接使用同一个对象,只需要更改请求参数
Devin.qu 2016-09-08
  • 打赏
  • 举报
回复
js 创建的xmlhttp对象 为什么会消耗 arm板的内存 ,它不是在浏览器上运行的么 怎么不消耗pc内存 谁来给我解释下 真心不理解

61,115

社区成员

发帖
与我相关
我的任务
社区描述
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
社区管理员
  • HTML(CSS)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧