内存泄漏

关于内存泄露

自作多情 提交于 2020-03-31 12:08:28
内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。 从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。 来源: https://www.cnblogs.com/cobain/archive

内存溢出和内存泄露的区别

徘徊边缘 提交于 2020-03-31 11:49:19
   内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。   内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。   memory leak会最终会导致out of memory!   内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类,内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的

java中内存泄露和内存溢出

回眸只為那壹抹淺笑 提交于 2020-03-31 11:48:36
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类,内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境

内存管理之堆

依然范特西╮ 提交于 2020-03-28 05:56:28
内存管理之堆 什么是堆 堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大,其次内存需求在时间和大小块上没有规律(操作系统上运行着的几十、几百、几千个进程随时都会电请或者释放内存,申请或者释放的内存块大小随意) 堆这种内存管理方式特点就是自由(随时申请、释放、大小块随意)。堆内存是操作系统划归给堆管理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者(用户进程)提供API (malloc和free)来使用堆内存。 我们什么时候使用堆内存?需要内存容量比较大时,需要反复使用及释放时,很多数据结构(譬如链表)的实现都要使用堆内存。 堆管理内存的特点 (大块内存、手工分配&使用&释放) 特点一容量不限(常规使用的需求容量都能满足) 特点二:申请及释放都需要手工进行,手工进行的含义就是需要程序员写代码明确进行申请malloc及释放free。如果程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,但是进程自己又以为这段内存已经不用了,再用的时候又会去申请新的内存块,这就叫吃内存),称为内存泄漏。在C/C++语言中,内存泄漏是最严重的程序bug,这也是别人认为Java/C#等语言比c/C+ +优秀的地方。 c语言操作堆内存的接口 (malloc free) 堆内存释放时最简单

IE9关联数组导致内存泄漏测试报告

廉价感情. 提交于 2020-03-26 09:07:47
3 月,跳不动了?>>> 最近为了满足一部分朋友的需求,给 zTree 提供了 destroy 的方法,用于让 zTree 自行清空。为了检查该方法是否有效,做了一个简单的测试——显示 5000 个节点然后清空,此操作循环 100 次,结果发现 IE9 下内存严重暴涨,于是进行了反复筛查,最终锁定了嫌疑犯:关联数组( data[key] = value )导致的内存泄漏! 只找到了嫌疑犯不行,定罪要有证据的,设计了一个简单的模型专门进行这个情况的测试,不排除可能由于我的疏忽得到的错误的结论,因此非常欢迎大家踊跃发表自己的看法,随便喷吧。。。。 【测试模型】 不要DOM和闭包、匿名函数干扰,一个全局变量 data 用于保存生成的数据;一个全局变量max用于设置数据最大条数;一个Function用于创建数据;一个Function 用于销毁数据。两个按钮,分别用于触发这两个Function。 补充:为了进行多种情况对比,因此一共制作了8组创建数据、销毁数据的 Function ,详细见后面的说明。 【测试流程】 【测试环境】 Win7 64位操作系统;IE Tester下的 IE6、8、9;FireFox v14.0.1;Chrome v21.0.1180.79;IE6性能太差,因此设置数据条数 max=100000;其他的浏览器都设置 max=1000000; 【开始测试】 1)

JavaScript 之 创建元素

南笙酒味 提交于 2020-03-25 19:49:55
方式一:    使用 document.write()     语法格式 : document.write('新设置的内容<p>标签也可以生成</p>');      注意 :在使用方式的时候,write() 输出内容,会把之前的整个页面覆盖掉 方式二:    使用 innerHTML     语法格式 : var box = document.getElementById('box'); box.innerHTML = '新内容<p>新标签</p>';      注意 :这种方式创建大量的标签会存在效率问题 方式三:    使用 document.createElement() 创建元素节点     语法格式 : var div = document.createElement('div'); //在内存中创建一个元素节点var textNode = document.createTextNode('Hello World'); //在内存中创建一个文本节点div.appendChild(textNode); //将文本节点追加到 元素节点内 document.body.appendChild(div);      这种方式,是先在内存中创建一个 DOM 对象,然后把这个对象添加到 DOM 树上。 性能问题     innerHTML 方法由于会对字符串进行解析

js垃圾回收及内存泄漏

别等时光非礼了梦想. 提交于 2020-03-25 09:22:25
js垃圾回收 js能够自动回收申请却未使用的内存,由于每次清除需要的性能较大,不是时时在刷新,而是每隔一段时间才进行一次。 回收的两种方式 标记清除(常用) 在内存中先标记变量,然后清除那些那些进入环境或者引用的变量的标记,当进入环境退出环境,将被重新标记并被清除,释放出内存。 引用计数 计算变量被引用的次数,引用次数为0将被清除释放内存。 缺点: 无法清除那些引用次数不为0,但又不需要的内存 let arr = [1,2,3]; console.log('ok'); //数组[1,2,3]引用次数为1,但是又没用到就会一直占着内存 //解决方式:arr.length=0 无法解决循环引用的问题 function fn(){ let obj1 = {}; let obj2 = {}; obj1.a = obj2; obj2.b = obj1; } //解决方法:手动释放 obj1 = null obj2 = null 内存泄漏 某些情况无法释放内存,变量一直处于环境中 出现内存泄漏的一些情况 最常见的就是闭包了 闭包会创建一个不会被销毁的栈内存。 不经意的全局变量 function fn(){ obj = {};//没用声明关键字,相当于创建了一个全局变量 } 计时器没有被清除 setInterval() setTimeout() //解决方法 清除对应定时器的id 滑稽脸 来源:

Egret销毁问题(内存泄漏)

筅森魡賤 提交于 2020-03-21 05:56:45
一 数组引用 移除场景时,值引用数组自动销毁 class HomeScene extends eui.Component{ public arr:Array<Number> = []; public constructor() { super(); for(let i=0;i<10000;i++){ this.arr.push(i); } } }    移除场景时,对象引用数组自动销毁,Ball对象自动销毁  class HomeScene extends eui.Component{ public arr:Array<Ball> = []; public constructor() { super(); for(let i=0;i<10;i++){ let ball:Ball = new Ball(); this.arr.push(ball); this.addChild(ball); } } } 二 对象引用 移除场景时,引用对象Ball自动销毁 class HomeScene extends eui.Component{ public ball:Ball; public constructor() { super(); this.ball = new Ball(); this.addChild(this.ball); } }    三 UI组件 移除场景时,UI组件自动销毁

jQuery2.x源码解析(缓存篇)

痞子三分冷 提交于 2020-03-16 20:11:17
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery自身的很多东西都依赖于缓存,比如事件、一些中间变量、动画等。同时他还为用户提供接口了使用缓存的接口,方便用户在元素节点上保存自己的数据,并且帮助用户解决直接把数据保存到DOM元素是可能引起的内存泄漏、命名冲突等问题。 同时,html5提出了一种通过属性缓存元素数据的功能,就是 data-*属性 ,他可以以字符串的形式保存数据,并且不会和元素固有属性冲突。jQuery的缓存提供了访问data-*的接口,与html5标准结合更加紧密,更加规范。 提问:jQuery不同版本的缓存实现原理是什么? 答:jQuery1.x与jQuery2.x、jQuery3.x是不同的。 jQuery1.x系列中,需要兼容ie6、ie7等早期的浏览器,在ie6、ie7这样的浏览器中,根据艾伦的博客,我们可以知道DOM元素与js对象相互引用,是会引起浏览器的内存泄漏问题。所以 jQuery1.x中,最大的问题是要防止在ie6、ie7浏览器上出现内存泄漏。为了避免DOM元素与js对象相互引用而造成的内存泄漏,jQuery必须从设计解决对象循环引用的问题。所以jQuery1.x将需要缓存到元素上的数据

JVM调优工具的使用方法

徘徊边缘 提交于 2020-03-11 02:39:05
常用的JVM调优工具:Jconsole,jProfile,VisualVMJconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里JProfiler:商业软件,需要付费。功能强大。详细说明参考这里VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。 调优的方法观察内存释放情况、集合类检查、对象树上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看可查看堆空间大小分配(年轻代、年老代、持久代分配)提供即时的垃圾回收功能垃圾监控(长时间监控回收情况) 查看堆内类、对象信息查看:数量、类型等 对象引用情况查看 有了堆信息查看方面的功能,我们一般可以顺利解决以下问题: --年老代年轻代大小划分是否合理 --内存泄漏 --垃圾回收算法设置是否合理 线程监控线程信息监控:系统线程数量。线程状态监控:各个线程都处在什么样的状态下 Dump线程详细信息:查看线程内部运行情况死锁检查 热点分析 CPU热点:检查系统哪些方法占用的大量CPU时间 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计) 这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和优化,而不是漫无目的的进行所有代码的优化。快照