美文网首页
内存泄漏Memory leak

内存泄漏Memory leak

作者: 斐硕人 | 来源:发表于2022-09-18 14:57 被阅读0次

是什么?

程序使用 new / malloc / realloc 动态存储分配函数 向系统在堆申请了内存空间,使用完后应该调用 free / delete 释放该内存块。
但因为种种原因使用完毕后未释放,导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。

危害

系统分配给每个应用的内存资源都是有限的,内存泄漏堆积危害很大。

  1. 频繁GC:内存泄漏导致其他组件可用的内存变少后,一方面会使得GC的频率加剧,再发生GC的时候,所有进程都必须等待,GC的频率越高,用户越容易感应到卡顿。另一方面内存变少,可能使得系统额外分配给该对象一些内存,而影响整个系统的运行情况。
  2. 导致程序运行崩溃:一旦内存不足以为某些对象分配所需要的空间,将会导致程序崩溃。

常见内存泄漏场景

  1. 变量不合理作用域(闭包:回调、计时器)
  2. DOM 引用
  3. 连接(数据库连接、网络连接和IO连接)未关闭
    等等等等

解决方式

总之就是闭源(良好的代码书写习惯)节流(释放内存)

  • 在 JavaScript 文件开头添加 use strict,使用严格模式。在严格模式下解析 JavaScript 可以防止意外的全局变量
  • 赋值为 null 或者重新分配
  • close()
  • document.body.removeChild()

监测

使用内存监视工具收集一段时间内的堆栈内存信息,观测增长趋势,来确定是否有内存泄漏。
以下内容来自参考文章5

Linux 常用的内存泄露检测工具:mtrace、memwatch、valgrind、debug_new.

以上的这些分析工具,所使用的方法大致分为以下几种:

  1. 注册内存分配/释放钩子函数(hook)。在 Linux 下可以malloc_hook, free_hook等5个钩子函数,在 Windows 下可以注册_CrtSetAllocHook钩子函数,这样在分配内存的时候就可以捕获这一请求并加以处理。Visual Leak Detectermtrace 使用此方式。
  2. 使用宏定义替换。将用户代码中的 malloc、free 替换为宏定义的 mwMalloc(sz, __FILE__, __LINE__)等自定义函数,从而跟踪内存请求,memwatch 即使用此方式。
  3. 操作符重载。此方法仅用于 C++ 语言中,通过重载 new、delete 操作符来实现跟踪内存请求,重载后的操作符类似于钩子函数意义。debug_new 采用此方式。

这些工具的内存检测方式:

  1. 维护一个内存操作链表,当有内存申请操作时,将其加入此链表中,当有释放操作时,从申请操作从链表中移除。如果到程序结束后此链表中还有内容,说明有内存泄露了;如果要释放的内存操作没有在链表中找到对应操作,则说明是释放了多次。使用此方法的有内置的调试工具,Visual Leak Detecter、mtrace、memwatch、debug_new
  2. 模拟进程的地址空间。仿照操作系统对进程内存操作的处理,在用户态下维护一个地址空间映射,此方法要求对进程地址空间的处理有较深的理解。因为 Windows 的进程地址空间分布不是开源的,所以模拟起来很困难,因此只支持 Linux。采用此方法的是 valgrind

相关文章

  1. 什么是内存泄漏?有什么危害?
  2. JavaScript中4种常见的内存泄漏及避免方法
  3. 内存泄漏的8种情况
  4. C++ 内存管理中内存泄漏问题产生原因以及解决方法
  5. Linux下内存泄漏工具

相关文章

  • 【Android测试】内存泄漏检测 LeakCanary

    什么是内存泄漏和内存溢出?内存泄漏有什么危害?LeakCanary检测内存泄漏? 内存泄漏(Memory Leak...

  • 11.2-1 Bitmap2 OOM

    简介 Out Of Memory(内存溢出):占用内存超出系统分配内存; memory leak(内存泄漏):占用...

  • 2022-03-29

    一::内存溢出(out of memory)和内存泄漏(memory leak)的区别内存溢出:应用所需要的内存超...

  • 内存泄漏

    什么是内存泄漏引起内存泄漏的原因野指针,空指针,僵尸对象 1.什么是内存泄漏 内存泄漏(Memory Leak)是...

  • 内存泄漏

    内存溢出(Memory Overflow)和内存泄露(Memory Leak)的区别1)内存泄漏例如:new了一块...

  • android内存泄漏快速解决

    明白原理 一般内存泄漏(traditional memory leak)的原因是:忘记释放分配的内存 逻辑内存泄漏...

  • A1_内存泄漏(循环引用)

    一、什么是内存泄漏,在 Obj-C 中如何检测内存泄漏? “内存泄漏(Memory Leak)是指程序中己动态分配...

  • Android内存泄漏和内存溢出详解

    什么是内存泄漏和内存溢出 内存泄漏(Memory Leak):指的是程序在申请内存空间之后,无法释放已占有的空间,...

  • 内存泄漏

    内存问题的可能情况 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏...

  • 浅谈前端中的内存泄漏

    一、内存泄漏的概念 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)程序的运行需要内存,只要...

网友评论

      本文标题:内存泄漏Memory leak

      本文链接:https://www.haomeiwen.com/subject/mwluortx.html