内存泄露知识

所谓的内存泄漏可以理解为内存单元逐渐被无用的数据占用在c c++里可以通过内存单元没有释放引起java里可以通过 未对作废数据内存单元的引用置null引起分配了内存而没有释放,逐渐耗尽内存资源,导致系统崩溃。

内存泄露是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况,重起计算机可以解决,但是也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。

内存泄漏可以分为4类:

1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。

一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

例如C语言编程中用到带有指针的运算,因为C指针是直导内存的,当运行完程序而没释放内存的话,那段内存就会泄露;同理会出现在C++中;所以malloc后一定要free,new了之后一定要delete,creatDC之后一定要deleteDC的。

个人理解:在编程过程中,如果我们在堆中动态审请了一块内存,在使用完这块内存后要及时把这块内存释放掉。如果没有及时释放,操作系统会认为这块内存仍然被使用,这就造成了内存泄露。这是程序开发人员必须要注意的问题。操作系统都有自己的内存管理和分配机制,如果内存管理策略不是很好就会引发内存碎片的存在。若不及时进行碎片整理,也将造成内存泄露。

听说,c/c++,java等语言存在内存泄露的隐患,C#语言机制好像就没有这方面的担忧,是这样嘛?

一个比较简单的判断内存泄漏的方法,看一下你的程序所占用的private bytes是多少,如果一直增加,也就说明有内存泄漏。

performance monitor里面可以检测private bytes的变化情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用removeChild方法从DOM树移除一个元素时,如果对该元素的引用没有解除,那么导致内存泄漏。也就是说,即使元素已经被移除,但在代码仍然保留了对该元素的引用,这导致无法释放该元素占用的内存空间。解决这个问题的方法是手动将引用指向null,以便告诉JavaScript引擎该引用不再需要了。例如,在移除一个按钮元素后,可以将该按钮的引用指向null,以便释放相关的内存空间。 使用定时器也可能导致内存泄漏。如果在定时器回调函数引用了一些资源,而这些资源在每次回调时都被修改或更新,那么这些资源可能一直存在于内存,即使在DOM树对应的元素已经被移除了。为了避免这种情况,我们需要在合适的时机清理对DOM元素的引用,或者在不需要定时器时取消定时器。 同样地,如果没有及时清理对DOM元素的引用,也导致内存泄漏。即使我们从DOM树移除了一个元素,但如果在代码仍然保留对该元素的引用,那么该元素的内存空间不被释放。因此,当我们确认不再需要对一个DOM元素的引用时,需要将其引用置为null,以便告知JavaScript引擎可以释放相关的内存空间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浏览器内存泄漏简单知识点](https://blog.csdn.net/yiyueqinghui/article/details/106643772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [今日份知识点:谈谈内存泄漏 及 在 Javascript 针对内存泄漏的垃圾回收机制 >](https://blog.csdn.net/MrWen2395772383/article/details/125486988)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值