js 下载视频流 内存溢出

JavaScript010

js 下载视频流 内存溢出,第1张

在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出

1、给DOM对象添加的属性是一个对象的引用。

范例:

var MyObject = {}

document.getElementById('myDiv').myProp = MyObject

解决方法:

在window.onunload事件中写上: document.getElementById('myDiv').myProp = null

2、DOM对象与JS对象相互引用。

范例:

function Encapsulator(element) {undefined

this.elementReference = element

element.myProp = this

}

new Encapsulator(document.getElementById('myDiv'))

解决方法:

在onunload事件中写上: document.getElementById('myDiv').myProp = null

3、给DOM对象用attachEvent绑定事件。

范例:

function doClick() {}

element.attachEvent("onclick", doClick)

解决方法:

在onunload事件中写上: element.detachEvent('onclick', doClick)

4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例:

var parentDiv = document.createElement("div")

var childDiv = document.createElement("div")

document.body.appendChild(parentDiv)

parentDiv.appendChild(childDiv)

解决方法:

从内到外执行appendChild:

var parentDiv = document.createElement("div")

var childDiv = document.createElement("div")

parentDiv.appendChild(childDiv)

document.body.appendChild(parentDiv)

5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。

范例:

for(i = 0i hostElement.text = "asdfasdfasdf"

}

这种方式相当于定义了5000个属性!

最近做el-tree组件开发的时候,选中某条会报这种错误。这句话的意思是堆超出了最大范围。

因为用例模块3333的id为3,父模块ID也是3。于是怀疑是数组转tree递归的时候导致堆溢出。这个时候打印了一下,数组转tree后的数据,果然是转换的时候逻辑写错了,导致id和父模块id一样无限递归循环导致堆溢出

于是在原有的转换基础上增加了红框内容,完美解决问题。

首先,你给出的这个函数 是个严重有缺陷的调用,他会无限递归最终内存溢出,

其次 你这段代码是要运行在什么地方,如果运行在浏览器中,不同浏览器解析到这段代码都会主动报错,不会调用,如果你运行在node环境,这段代码运行会依照你物理内存大小 和系统内存分配方法进行调用 最终爆掉,很显然,你的问题没有完整的条件

记录这个调用也很简单,在函数外部声明一个变量 并且赋值为0;并且在调用的时候给这个变量做自增操作,最后的数据就是完成调用到溢出的调用次数。

关于内存结构,假设一个 数据类型是整数,8字节 ,这句话本身就是个问题,首先Var A = 1这是声明了一个 类型为整数的 变量,这个时候 他在栈中声明了一个东西叫A 同时 指向了池的1 所以 这个8字节代表了2部分,他的栈空间占用就是最终调用函数的次数;不管是什么数据类型,变了的声明都是在栈中,数据都在池里面。如果只是声明了 var A 但是并不赋值,此时他在内存结构中 只会占用栈空间,但是没有数据类型;跟没有整数,字符串,数组,对象,undiluted,这样的数据类型之分了。

我个人觉得,这要么是一个非常刁钻的考试题,要么就是不知道谁脑子有毛病想出来的,显然这是一个非常不科学的题目,实际情况程序是根本跑不起来的,