内存管理的优化

二.内存管理
2.1 循环引用
说明:如果循环引用中包含 DOM 对象或者 ActiveX 对象,那么就会发生
内存泄露。内存泄露的后果是在浏览器关闭前,即使是刷新页面,这部分
内存不会被浏览器释放。
简单的循环引用:
var el = document.getElementById(‘MyElement‘);
var func = function () {…}
el.func = func;
func.element = el;
但是通常不会出现这种情况。通常循环引用发生在为 dom 元素添加闭包
作为 expendo 的时候。
如:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
}
init();
init 在执行的时候,当前上下文我们叫做 context。这个时候, context
引用了 el, el 引用了 function, function 引用了 context。这时候形成
了一个循环引用。
下面 2 种方法可以解决循环引用:
1) 置空 dom 对象
服用前:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
}
init();
服用后:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
el = null;
}
init();
将 el 置空, context 中不包含对 dom 对象的引用,从而打断循环应用。
如果我们需要将 dom 对象返回,可以用如下方法:
服用前:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
return el;
}
init();
服用后:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
try{
return el;
} finally {
el = null;
} }
init();
2) 构造新的 context
服用前:
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = function () {……}
}
init();
服用后:
function elClickHandler() {……}
function init() {
var el = document.getElementById(‘MyElement‘);
el.onclick = elClickHandler;
}
init();
把 function 抽到新的 context 中,这样, function 的 context 就不包含
对 el 的引用,从而打断循环引用。

function create () {
var gc = document.getElementById(‘clicme‘);
for (var i = 0; i < 5000 ; i++) {
var el = document.createElement(‘div‘);
el.innerHTML = "test";
//下面这句可以注释掉,看看浏览器在任务管理器中,点击按钮 然后刷新后的内存变化
// gc.appendChild(el);
}
}
create();

时间: 2024-10-10 02:22:40

内存管理的优化的相关文章

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato

Android内存管理、优化

RAM对于软件开发环境而言是有价值的资源,但它对受限于物理内存限制的操作系统具有更大的价值.即使Android Runtime和Dalvik virtual machein执行常规的垃圾回收,但这并不意味着你可以忽略app在何时何地指派和释放内存.你仍然需要去避免产生内存泄露.比如长期持有静态成员变量常常引起内存泄露,你应该在合适的时间,比如在生命周期回调函数处释放一些引用对象,来避免内存泄露的发生. 这篇文章将阐述怎样在app中主动的降低内存消耗.关于java编程中清理资源的一般实践,请参照其

Android性能优化:谈谈Bitmap的内存管理与优化

最近除了忙着项目开发上的事情,还有就是准备我的毕业论文,有一小段时间没写博客了,今晚难得想总结一下,刚好又有一点时间,于是凑合着来一篇,好了,唠叨话不多说,直接入正题.从事Android移动端的开发以来,想必是经常要与内存问题打交道的,说到Android开发中遇到的内存问题,像Bitmap这种吃内存的大户稍微处理不当就很容易造成OOM,当然,目前已经有很多知名的开源图片加载框架,例如:ImageLoader,Picasso等等,这些框架已经能够很好的解决了Bitmap造成的OOM问题,虽然这些框

Android性能优化:谈话Bitmap内存管理和优化

最近除了那些忙着项目开发的事情,目前正在准备我的论文.短的时间没有写博客,今晚难得想总结.只要有一点时间.因此,为了凑合用,行.唠叨罗嗦,直接进入正题. 从事Android自移动终端的发展,想必是常常要与内存问题打交道的,说到Android开发中遇到的内存问题,像Bitmap这样的吃内存的大户略微处理不当就非常easy造成OOM,当然,眼下已经有非常多知名的开源图片载入框架,比如:ImageLoader.Picasso等等,这些框架已经能够非常好的攻克了Bitmap造成的OOM问题,尽管这些框架

iOS内存管理和优化 from 刘延军

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h

Go内存管理

1.前言 编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2.除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc. 二者在避免内存碎片和性能上均比glic有比较大的优势,在多线程环境中效果更明显. Golang中也实现了内存分配器,原理与tcmalloc类似,简单的说就是维护一块大的全局内存,每个线程(Golang中为P)维护一块小的私有内存,私有内存不足再从全局申请.

TCMalloc优化Nginx、MySQL、Redis内存管理

TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多.TCMalloc是google-perftools工具中的一个(gperftools四个工具分别是:TCMalloc.heap-checker.heap-profiler和cpu-profiler),这个工具是开源的,以源码形式发布.如果觉得自己维护一个内存分配器麻烦的话,可以考虑将TCMalloc静态库连接到你的程序中.使

内存管理 &amp; 内存优化技巧 浅析

内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验.如何让回收那些不再使用的对象呢?本文着重介绍OC中的内存管理. 所谓内存管理,就是对内存进行管理,涉及的操作有: 1.分配内存:比如创建一个对象,会增加内存占用: 2.清除内存:比如销毁一个对象,会减少内存占用. 内存管理的管理范围: 1.任何继承了NSObject的对象: 2.对其他非对象类