- 浏览: 524474 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
rgqancy:
终于明白为啥XML里要带jdbcType=XXXX了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
rzh0001:
Thanks a lot
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
guji528:
学习了,谢谢
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
AKka:
彻底清楚这个错误的原因了。向楼主学习了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
远去的渡口:
武汉小吃,我最爱热干面和鸭脖,想念啊~~
过年时候还学习编程, ...
过年的心情
当一个系统不能正确的管理他的内存分配时,这个系统就存在内存泄漏 ,这对系统来说是一个 bug 。内存泄漏 的现象可以有程序调用失败、执行减慢等。
微软的 Internet Explorer 就存在一系列的内存泄漏 ,其中最严重的就算是执行 Jscript 时产生的泄漏。当一个 DOM 对象包涵有一个 JavaScript 对象(例如一个事件处理函数)的引用,同时如果这个 JavaScript 对象又包涵该 DOM 对象,那么这个循环引用就形成了。这种结构本质上没有问题。此时,因为该 DOM 对象和这个事件处理函数并没有别的引用存在,那么垃圾回收器(一种自动的内存资源管理器)本应该把它们都回收点,并内存释放。 JavaScript 的垃圾回收器能够检测到这种循环引用,并不会对他产生困惑。但是不幸的是, IE DOM 的内存并不能被 Jscript 所管理。他有他自己的内存管理系统,然而这套系统并不知道循环引用,使得一切都变得混乱。这就导致了,当循环引用形成的时候,内存释放工作不能完成,也就是产生了内存泄漏 。长时间的内存泄漏就将产生内存的匮乏,使得浏览器因缺乏必要内存而崩溃? 。
我们可以来演示一下。在第一段程序 -question1 中,我们将动态创建以 10 个为一组共计 10000 个的 DOM 元素( <span> ),创建 10 个然后删除在创建 10 个,如此循环。你在运行这段程序时打开 Windows 任务管理器,就可以观察到页面运行时 PF( 虚拟内存 ) 使用率一直保持不变。 PF 使用率的变化可以视为内存分配是否无效的指标。
Question1 |
<html
>
<head
>
<title
>Queue Test 1</title
>
</head
>
<body
>
<script
>
/*global setTimeout */
(function (limit, delay) {
var queue = new Array(10);
var n = 0;
function makeSpan(n) {
var s = document.createElement('span');
document.body.appendChild(s);
var t = document.createTextNode(' ' + n);
s.appendChild(t);
return s;
}
function process(n) {
queue.push(makeSpan(n));
var s = queue.shift();
if (s) {
s.parentNode.removeChild(s);
}
}
function loop() {
if (n < limit) {
process(n);
n += 1;
setTimeout(loop, delay);
}
}
loop();
})(10000, 10);
</script
>
</body
>
</ html > |
接下来我们运行第二段程序 queuetest2 。除了做与 queuetest1 相同的事情以外,它还未每个元素添加了一个点击事件响应函数。在 Mozila 和 Opera 上,虚拟 PF 利用率和 queuetest1 是一样的,但是在 IE 上我们可以看见由于内存泄漏 而产生的每秒一兆的虚拟内存的稳定增量,通常这种泄露都不会被注意到。但是由于 Ajax 的日益流行,使得页面在浏览器的停留时间增长,使得问题变得常见了。
Question2 |
<html> <head><title>Queue Test 2</title> </head> <body> <script> /*global setTimeout */ (function (limit, delay) { var queue = new Array(10); var n = 0; function makeSpan(n) { var s = document.createElement('span'); document.body.appendChild(s); var t = document.createTextNode(' ' + n); s.appendChild(t); s.onclick = function (e) { s.style.backgroundColor = 'red'; alert(n); }; return s; } function process(n) { queue.push(makeSpan(n)); var s = queue.shift(); if (s) { s.parentNode.removeChild(s); } } function loop() { if (n < limit) { process(n); n += 1; setTimeout(loop, delay); } } loop(); })(10000, 10); </script> </body> </html> |
因为 IE 不能对循环引用进行回收,所以这个任务就落在了我们的肩上。如果我们明确的打破这个循环引用,那么 IE 就能够完成垃圾回收工作了。具微软的解释,引起内存泄漏 的原因是闭包,然而这个结论肯定是非常错误的,并且这使得微软给开发者的建议也成了错误的建议。那么通过 DOM 来打破循环引用更简单,因为实际上不可能通过 Jscript 来实现。
当我们处理完一个元素后,我们必须通过把它所有的事件处理函数制空来达到破坏循环引用的目的。我们所需要做的就是把每个事件的处理函数设为空就可以了。我们甚至可以清理函数来完成这一工作。
清理函数将保存一份 DOM 元素的引用。它将循环检测这个元素的所有属性。如果发现了时间处理函数,就把它值为空。这样就破坏了循环引用,使得内存可以被回收释放。它同样也会检测该元素的子元素,打破他们的循环引用。这个清理函数,只在 IE 中有效果,对于 Mozilla 和 Opera 都无效。不管是用 removeChild() 或者是设置 innerHTML 属性的值,都应该在删除元素之前调用清理函数。
function purge(d) {
var a = d.attributes, i, l, n;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
n = a[i].name;
if (typeof d[n] === 'function') {
d[n] = null;
}
}
}
a = d.childNodes;
if (a) {
l = a.length;
for (i = 0; i < l; i += 1) {
purge(d.childNodes[i]);
}
}
}
那么我们现在来运新第3 个程序,queuetest3 ,在程序3 里,元素在被删除之前都调用了清理函数。
Question3 |
<html> <head><title>Queue Test 3</title> </head> <body> <p> Queue Test 3 adds an event handler to each span, and removes it when finished. See <a href="http://www.crockford.com/javascript /memory/leak.html">http://www.crockford.com/javascript/memory/leak.html</a> </p> <script> /*global onunload, setTimeout */ (function (limit, delay) { var queue = new Array(10); var n = 0; function makeSpan(n) { var s = document.createElement('span'); document.body.appendChild(s); var t = document.createTextNode(' ' + n); s.appendChild(t); s.onclick = function (e) { s.style.backgroundColor = 'red'; alert(n); }; return s; } function purge(d) { var a = d.attributes, i, l, n; if (a) { l = a.length; for (i = 0; i < l; i += 1) { n = a[i].name; if (typeof d[n] === 'function') { d[n] = null; } } } a = d.childNodes; if (a) { l = a.length; for (i = 0; i < l; i += 1) { purge(d.childNodes[i]); } } } function process(n) { queue.push(makeSpan(n)); var s = queue.shift(); if (s) { purge(s); s.parentNode.removeChild(s); } } function loop() { if (n < limit) { process(n); n += 1; setTimeout(loop, delay); } } onunload = function (e) { purge(document.body); }; loop(); })(10000, 10); </script> </body> </html> |
更新:微软发布了该问题的补丁: 929874 。如果你有十足的信心确保你所有的用户都可以获得该更新,那么你将不再需要上面的清理函数。但不幸的是,这不可能如你所愿,所以可能清理工作在 IE6 被淘汰之前还是有必要的。
这就是 web 的天性,有清理不完的 bugs 。
发表评论
-
html focus 引入 类似微博的效果
2012-09-18 18:01 1316<!DOCTYPE html PUBLIC &q ... -
javascript 类编程(未完)
2010-07-20 18:03 1471最近想总结一下JavaScript类编程,有时间写一点。 J ... -
正则表达式
2010-01-20 14:48 1003正则表达式用于字符串 ... -
insertAdjacentHTML 用法
2010-01-09 21:13 1883insertAdjacentHTML方法示例 添加HTML内 ... -
float margin padding
2009-12-23 16:46 2474今天做网站的时候发 ... -
WEB2.0标准教程:第二天 什么是名字空间
2009-12-14 10:28 1059DOCTYPE声明好以后,接下来的代码是: <html ... -
CSS兼容:如何解决IE7和IE8的BUG
2009-12-14 10:04 2297CSS兼容问题已经是CSS网页布局技术中的重要组成部分,也让 ... -
悟道web标准:前端性能优化
2009-12-14 09:40 1538悟道web标准:前端性能优化 前端性能优化完全是一个技术话题 ... -
JavaScript对象探讨
2009-12-13 11:39 990由于JavaScript的灵活性,可以让每个人按照自己的习惯进 ... -
用css网站布局之十步实录
2009-12-10 11:32 1241首先需要规划网站,本教程将以下图为例构建网站 其基本布局见 ... -
WEB标准最佳实践:五个需要注意的地方
2009-12-09 21:32 969一、永远使用小写字母 不好的做法: <DI ... -
不要内置JavaScript脚本 并将它置于HTML文档底部
2009-12-09 21:27 1487不要内置JavaScript脚本,这不是1996年了! ... -
javascript uri 编码
2009-10-19 10:53 1924对比 javascript url编码 javascript ... -
javascript 购物车
2009-10-17 13:13 3328购物车相当于现实中超 ... -
doument.execomand 用法
2009-07-11 15:54 13402D-Position 允许通过拖曳移动绝对定位的对象。 ... -
clientX pageX
2009-06-26 15:21 2124screenX:鼠标在显示屏幕上的坐标。 clientX ... -
hasOwnProperty
2009-06-26 11:19 1608JavaScript中hasOwnProperty函数方 ... -
getBoundingClientRect()
2009-06-25 15:16 1280getBoundingClientRect() 来获取页面 ... -
jquery 选择器 使用
2009-06-15 17:01 1456[翻译]jQuery 选择器的使用 ... -
Ext 3.0 core 简要pdf 下载
2009-06-07 11:02 1197今天早上 无意中看到Ext中文 网站有Ext3.0 core ...
相关推荐
该文档是笔者经余月整理后所得,里面包含了JavaScript内存相关的知识概述。大概有浏览器内存管理、JavaScript内存泄漏及补救措施、闭包的概念,希望对诸君有帮助
主要介绍了JavaScript内存管理介绍,本文讲解了内存生命周期、JavaScript的内存分配、通过函数调用的内存分配、当内存不再需要使用时释放等内容,需要的朋友可以参考下
因为垃圾回收的存在,让javascript等高级语言开发者产生了一个错误的认识,以为可以不用关心内存管理。 内存生命周期 不管什么样的编程语言,内存的生命周期基本上是一致的。 1.分配你需要的内存 2.使用他进行读写...
本文是对javascript中的内存管理进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
你可能听说过JAVA、.NET、PHP这些语言有垃圾回收的内存管理机制,但是很少会听到JavaScript也有自己的内存管理机制,JavaScript同样有着类似的垃圾回收功能。本文主要讲述了JavaScript的垃圾回收原理和具体的过程。 ...
1.背景:内存管理——动态分区分配方式的模拟。初始内存空间为 640K,分别利用首次适应算法和最佳适应算法进行内存块的分配和回收。 2.开发:使用javascript进行开发。 3.运行:使用浏览器运行index.html即可,已经...
JavaScript避开内存泄露及内存管理技巧_.docx
一篇文章弄懂javascript内存泄漏 在了解什么是内存泄漏之前, 我们应该要对内存是什么有个概念, 随机存取存储器(英语:Random Access Memory,缩写:RAM)是与 CPU 直接交换数据的内部存储器。它可以随时读写, ...
JavaScript调试器的内存管理.pdf
JavaScript执行效率优化及内存管理优化.docx
JavaScript执行效率优化与内存管理优化.pdf
javascript错误的认识不用关心内存管理.docx
相对C/C++ 而言,我们所用的JavaScript 在内存这一方面的处理已经让我们在开发中更...1. 语言层面的内存管理 1.1 作用域 作用域(scope)是JavaScript 编程中一个非常重要的运行机制,在同步JavaScript 编程中它并不能充
本文实例讲述了JavaScript避免内存泄露及内存管理技巧,非常实用。分享给大家供大家参考之用。具体方法如下: 本文内容源自谷歌WebPerf(伦敦WebPerf集团),2014年8月26日。 一般来说,高效的JavaScript Web应用...
如果我们想要优化性能,首先我们必须得了解JavaScript中的垃圾回收机制,...在JavaScript中,具有自动垃圾回收机制,也就是说执行环境会自动负责管理代码执行过程中的内存使用情况,会自动清除一些没有用的变量,以此
4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本; 6.是否Maven项目:是; 技术栈 1. 后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+CSS+JavaScript+jQuery+bootstrap 使用说明 ...
随着现在的编程语言功能越来越成熟、复杂,内存管理也容易被大家忽略。本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题。 概述 像C语言这样的编程...