内存泄漏定位以及解决

1 内存泄漏定位

1.1 valgrind

Valgrind包含下列工具:

  • memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
  • callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能
  • cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
  • helgrind:用于检查多线程程序的竞态条件
  • massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

通过valgrand --tool=name 程序名来分别调用的

Memcheck:  最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。

  • 对未初始化内存的使用
  • 读/写释放后的内存块
  • 读/写超出malloc分配的内存块
  • 读/写不适当的栈中内存块
  • 内存泄漏,指向一块内存的指针永远丢失
  • 不正确的malloc/free或new/delete匹配

1.2 观察内存

随着程序的运行内存不断增长,根据情况判断是否泄漏。

2 避免内存泄漏

2.1 良好的编码习惯

使用malloc分配的内存,要调用free释放

malloc\realloc ------  free

new \new[] ----------  delete \delete[]

2.2 使用RAII管理资源-资源获取即初始化

本质上说就是将内存的获取放在构造函数,将内存的释放放在析构函数。主要是避免了忘记free或是delete。但是如果没有在析构函数中释放资源,那么RAII也是没多大用处的。

2.3 share_ptr来管理内存

类似于GC了

原文地址:https://www.cnblogs.com/perfy576/p/8566160.html

时间: 2024-10-16 23:00:21

内存泄漏定位以及解决的相关文章

Android内存泄漏查找和解决

Android内存泄漏查找和解决 目录: 内存泄漏的概念 一个内存泄漏的例子 Java中"失效"的private修饰符 回头看内存泄漏例子泄漏的重点 强引用与弱引用 解决内部类的内存泄漏 Context造成的泄漏 使用LeakCanary工具查找内存泄漏 总结 一.内存泄漏概念 1.什么是内存泄漏? 用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.即所谓的内存泄漏. 其实说白了就是该内存空间使用完毕之后未回收 2.内存泄漏会导致的问题 内

Java进程内存泄漏判断及解决方法

内存泄漏种类Java使用的内存种类包含三种,这三种类型的内存都可能发生内存泄漏.? 堆内存泄漏,如果JVM 不能在java 堆中获得更多内存来分配更多java 对象,将会抛出java堆内存不足(java OOM) 错误.如果java 堆充满了活动对象,并且JVM 无法再扩展java 堆,那么它将不能分配更多java 对象.更多情况是程序设计有问题,生成的对象占用过多的堆内存造成堆内存泄漏.? 本地内存泄漏, 如果JVM 无法获得更多本地内存,它将抛出本地OOM错误.当进程用到的内存到达操作系统的

Android开发 |常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了. 内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一.由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时

关于Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题及解决办法

近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比以前每天40多w发送量暴增到每天达到200w发送量.因为是采用Java做发送底层,压力递增情况下不可避免的面对内存问题.在发送量接近200w情况下,出现内存泄露问题了. 经过对系统运行检查发现: 1)每次重启系统3-4个小时后,均发现一点不稳定: 2)在3-4个小时后,出现out of memory的错误:java.lang.OutOfMemoryError: GC overhead limit exc

基于Android Studio的内存泄漏检测与解决全攻略

自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclipse,成为主流的Android开发IDE.Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,让开发者可以更方便分析App性能.Google在IO大会上一直告诫开发者不要无节制的使用手机内存,要注意一些不良的开发习惯会导致App的内存泄漏.虽然如今网上

内存问题定位与解决

内存问题定位基本流程: 主要用到的性能计数器 Page life expectancy (数据库计数器:主要显示不被使用的页,将在缓存中停留的秒数 ) Lazy writes/sec (数据库计数器:惰性写入器会在内存有压力且有新的内存需求时触发,成批的刷新“老化的缓冲区”) Page Reads/sec,Page Writes/sec (这里使用数据库级别计数器:当需要读取或写入的页不在内存中,需要到磁盘中读取时计数) Target Server Memory (KB)  (SQL serve

简单内存泄漏检测方法 解决 Detected memory leaks! 问题

最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} normal block at 0x05785AD0, 152 bytes long. Data: << N N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00 Object dump complete.   而且每次退出都是一样的.泄漏的内存块都是98500. 解决方法: 1.

使用HandyJSON导致的内存泄漏问题相关解决方法

在移动开发中,与服务器打交道是不可避免的,从服务器拿到的接口数据最终都会被我们解析成模型,现在比较常见的数据传输格式是json格式,对json格式的解析可以使用原生的解析方式,也可以使用第三方的,我们的项目中使用的是阿里开源的一个swift编写的解析框架--HandyJSON. 在使用过程中,使用instruments的Leak Checks工具对内存泄漏进行检测时发现了这个框架导致了不少的内存泄漏,如图1-1: 这张图是在APP进入首页并将数据加载完毕时截取的,可以看到,HandyJSON一共

MFC多线程内存泄漏问题&amp;amp;解决方法

在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个比較快捷的方法便是选择MFC多线程:AfxBeginThread或者CreateThread来进建立多线程.当一两个线程还是能够得.当有3个或者3个以上的线程出现时,极可能出现内存泄漏.原因分析例如以下: CWinThread的多线程不安全性: 由于 CWinThread 会调用_beginthre