内存篇之堆泄漏

用valgrind定位内存泄漏 如果准备得不成功,那就要准备失败了。在笔试面试中,遇到内存泄漏的定位问题,如果连valgrind都说不出来,那就很容易歇菜了。总之,无论是为了找工作,还是为了实际工作中的问题,都很有必要熟练使用valgrind,那么,我们一起来看看这玩意儿是怎么回事。 阅读详情

    “堆泄漏”即常说的内存泄漏,是嵌入式软件里的常见问题,会导致软件运行一段时间后内存耗尽。

什么是”堆泄漏”?

    内存分配和释放的操作是程序员根据需要动态随机发起,程序本身(或编译工具)无法自动判断某块已分配的内存什么时候不再被使用,必须由程序员自己手动调用free释放,以便为其他程序腾出空间。而一旦程序员忘记释放某块内存,它就不能回到可用内存,系统总的可分配内存就随之减少,这就是内存泄漏。注意这里的内存特指堆(heap),只有堆内存才需要程序员自己控制分配和释放。所以内存泄漏和堆泄漏是同一概念。

    新手对泄漏这个词往往感到不理解,不就是分配后忘记释放,怎么叫泄漏呢?叫内存丢失不是更通俗么?

    关于这点,可以打个比方,分配内存就是从银行贷款,而释放内存就是给银行还钱。如果有人借了钱却赖帐不还,那么银行可支配的钱就会减少,银行总资产就被损失或泄漏。类似,堆是一块固定大小内存,“借”给不同程序使用,如果某个程序只借不还,堆管理所能支配的内存就减少,因此内存泄漏是针对系统中总的可支配内存资源来说,而并不是物理内存真的丢失。从这个角度理解,leak绝对比lost更准确生动:一种资源在封闭系统中循环使用,如果部分资源无法回到循环,不正是泄漏到封闭系统之外了么?

   借钱不还的银行客户越来越多,最终银行就会因为没钱放贷周转而破产。同样发生内存泄漏,直接的表现就是软件运行越来越慢,最终甚至因分不到内存而崩溃。(所以说一定要判断malloc的返回值,不是每次都能从银行借到钱滴)

泄漏原因及对策

    所有老师都会强调malloc后一定要有free,但实际编写复杂代码时,内存泄漏几乎不可避免。比如下面多分支退出,某分支忘记释放已分配的内存,就导致泄漏:

    void MyFunc(int size)

    {

      char* p= malloc(size);

      if( !GetStringFrom( p, nSize ) )

      {

        printf(“Error”);

        return;

      }

       …//using the string pointed by p;

      free(p);

    }

    无法完全避免内存泄漏,只能通过一些编程原则减少泄漏的概率:

    1) 减少多分支退出而遗漏free,可用goto语句保证函数只有一个退出点。

    2) 保证在同一层上使用malloc/free对,也就是说不要在子函数中malloc,在外层主函数free。这种内存在不同层次分配释放会使逻辑层次混乱,很容易导致内存泄漏。

    char* AllocStrFromHeap(int len)

    {

      char *pstr;

      if ( len <= 0 ) return NULL;

      return ( char* ) malloc( len );

    }

    相反如果在主函数中malloc并使用内存,而在某子函数中释放参数所指内存,可能导致主函数中出现野指针(后续)。

    3)人工review代码查找内存泄漏很困难,可借助工具快速检测,如boundchecker/pc-lint等都能通过自动扫描代码找到内存泄漏。

隐式泄漏

    是指某内存已使用完,明明可以早点free掉,却非等到软件退出前才释放,俗称“占着XX不XX”,虽然程序最终释放了所有内存,严格意义上没有泄漏,但某些场合隐式泄露同样会导致严重后果:比如某长期运行的服务器程序,如果不断分配而不及时释放内存,最后系统很可能在运行中途就因堆内存耗尽而crash,因此内存使用过程中,不但要确保释放内存,而且用完要尽快释放,而不要全等到退出前释放,以消除隐式泄漏,确保内存占用峰值不超过系统堆资源上限。

Unity中的内存泄漏 摘要:Unity内存泄漏主要发生在托管堆(C#)和本机堆(引擎资源)两个层面。托管堆泄漏常见于未取消事件订阅、静态引用和闭包捕获;本机堆泄漏多因资源未卸载、组件残留引用或协程未终止。检测工具有Unity Profiler、dotMemory等,解决方案包括规范的资源生命周期管理、对象池模式和安全事件处理。建议开发早期建立内存检测流程,监控关键指标如托管堆增量(ΔH)和本机内存增长率(r>5MB/min需排查)。通过工具检测与代码规范结合,可解决90%以上泄漏问题。(150字) 阅读详情

相关推荐

VC/MFC 内存泄漏的个人总结

首先先看看下面的内容吧! 我就是认真阅读了它,并结合自己所学的东西,解决了一个超难得问题(自己觉得!嘿嘿)关于MFC下检查和消除内存泄露的技巧摘要本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VC++查找,定位和消除内存泄露的方法技巧。关键词:VC++;CRT 调试堆函数;试探法。编译环境VC++6.0技术原理检测内存泄漏的主要工具是调试器和 CR

Irene的专栏 3681

分布式 | 令人头疼的堆外内存泄露怎么排查?

到这里,整个堆外内存泄露的排查就结束了。希望对大家有帮助。

ActionTech的博客 1425

Android内存泄漏分析与优化:堆Dump文件详解及实践

Memory Analyzer Tool 通常作为一个插件集成在 Eclipse IDE 中,也可以作为一个独立的工具进行安装和使用。要安装 MAT,最简便的方式是通过 Eclipse Marketplace。安装步骤如下:打开 Eclipse IDE。进入菜单栏中的 "Help" -> "Eclipse Marketplace..."。在 Marketplace 搜索框中输入 "Memory Analyzer"。找到并选择 "Memory Analyzer" 插件。

weixin_36213081的博客 1220

【JVM】JVM内存结构之——堆(堆内存泄漏问题/ 内存泄漏分类/ 内存溢出/ 内存溢出解决方案/ 排查堆内存泄漏问题/ CPU飙高问题)

目录1. 程序计数器2. 堆3. 堆内存泄漏问题4. 内存泄漏的分类5. 堆内存溢出问题6. 常见内存解决方案6.1 如何解决内存溢出 1. 程序计数器 1.程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读取下一条指令。更确切的说,一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确保线程的正确执行。 2.为了确保线程切换后(上下文切换

记录各种Bug解决案例及日常学习内容 1328

嵌入式开发调试内存泄露的一种方法

在嵌入式应用开发中,经常只能通过串口打印来调试软件,在软件出现内存泄露的问题时,比较难定位问题的位置,本文档提供了一种定位内存泄露的方法

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能

龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工

weixin_42219287的博客 625

一次完整的JVM堆外内存泄漏故障排查记录

前言记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些「JVM内存分配的原理分析」以及「常用的JVM问题排查手段和工具分享」,希望对大家有所帮助。在整个排查过程中,我也走了...

杨建荣的学习笔记 2045

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

JVM堆外泄露分析&解决

JVM堆外泄露分析&解决

志豪的博客 3021

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1005

深度:善用人工智能推动高等教育学习、教学与治理的深层变革

从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。某高校的创新实践表明,引入AI生成虚拟患者后,医学生在临床沟通训练中的共情能力提升27%,印证了技术工具与人文教育的互补效应。美国卡内基梅隆大学的实践表明,经过系统培训的教师,其课程设计效率提升40%,且能精准定位83%学生的学习难点。当每个学生都掌握提示工程原理,每位教师都能驾驭AI教学工具,每所高校都建立智能治理框架时,教育将真正实现"以人为本"与"技术为用"的有机统一。

IT胶囊 1095

JVM-堆外内存泄漏

0 实战参考 groupapi 堆外内存泄漏(non-heap memory leak)问题排查过程与相关工具介绍 FastJson内存泄漏 1 现象及原因 堆外内存 java 8下是指除了Xmx设置的java堆(java 8以下版本还包括MaxPermSize设定的持久代大小)外,java进程使用的其他内存。主要包括:DirectByteBuffer分配的内存,JNI里分配的内存,线程栈分配占用的系统内存,jvm本身运行过程分配的内存,codeCache,java 8里还包括m

weixin_43934698的博客 1902

【COMSOL】将一个面上数据导出CSV或txt格式的方法

在COMSOL中参数化扫描后,把一个面上或体里的数据按照CSV或TXT格式导出的方法。

dave496206的博客 2991

什么是堆,栈,内存泄漏和内存溢出?

heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(h

Little devil 6431

CMOS 图像传感器——Skipping 和 Binning 模式

Skipping 和 Binning 模式

沧海一升的博客 6004

第4章 部署负载均衡 Keepalived + HAProxy

本章在所有 Master 节点部署 Keepalived + HAProxy,为 kube-apiserver 提供高可用入口。Keepalived 实现 VIP(192.168.3.59)漂移,HAProxy 轮询转发请求至三个 Master 的 6443 端口(监听 6444 避免冲突)。健康检查脚本连续 5 次失败则停止 Keepalived,触发 VIP 自动切换。本章还包含配置详解、日常运维和问题排查。

幸福街--linux技术分享 120

【开发篇】一、内存泄漏的分析工具

最后,可以使用Visual VM的采样tab页,查看当前堆里的对象信息。一个对象不再使用后,(因其从GC Root仍有引用链可达)却未被JVM回收,白白占着内存,即内存泄漏,这个效果累积,最后就会OOM。再引入另一依赖:micrometer,将JVM、数据库连接池的信息、磁盘信息等收集上来,组装成Prometheus能识别的格式。查看堆和元空间的走向:这里有size向max扩容的知识点,别看到高的线就认为空间不足。还有,如果是集群化部署,不是上面的java -jar一个jar包,远程就很不方便。

llg___的博客 3803

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3206

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏概念及内存泄漏检测工具介绍

十橙 6769

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JVM下篇:性能监控与调优篇-补充:浅堆深堆与内存泄露

而到对象 D 的所有路径中,必然经过对象 C,即使是从对象 F 到对象 D 的引用,从根节点出发,也是经过对象 C 的,所以,对象 D 的直接支配者为对象 C。支配树的概念源自图论。上面代码和图示主演演示 WeakHashMap 如何自动释放缓存对象,当 init 函数执行完成后,局部变量字符串引用 weakd1,weakd2,d1,d2 都会消失,此时只有静态 map 中保存中对字符串对象的引用,可以看到,调用 gc 之后,HashMap 的没有被回收,而 WeakHashMap 里面的缓存被回收了。

yuanmomoya的博客 1712

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

如何排查Java内存泄漏

没有经验的程序员经常认为Java的自动垃圾回收完全使他们免于担心内存管理。这是一个常见的误解:虽然垃圾收集器做得很好,但即使是最好的程序员也完全有可能成为严重破坏内存泄漏的牺牲品。让我解释一下。 当不必要地维护不再需要的对象引用时,会发生内存泄漏。这些泄漏很糟糕。首先,当程序消耗越来越多的资源时,它们会对计算机施加不必要的压力。更糟糕的是,检测这些泄漏可能很困难:静态分析通常很难精确识别这些冗余引用,现有的泄漏检测工具会跟踪和报告有关单个对象的细粒度信息,产生难以解释且缺乏精确度的结果。 换句话说,泄漏要么

sutianxiao的博客 2374

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

堆外内存泄漏排查:K8s中Java容器频繁OOM被重启,但堆dump无异常

堆外内存泄漏排查:K8s中Java容器频繁OOM被重启,但堆dump无异常

weixin_46619605的博客 1699

《堆 / 栈 / 静态区区别、内存泄漏原因及排查》

堆内存泄漏:程序员通过new/malloc在堆上分配了内存,后续既没有执行delete/free释放,又失去了所有指向该堆内存的指针,导致这块内存成为「不可访问的垃圾内存」—— 程序运行期间无法再使用,也无法释放,直到程序退出后由操作系统回收。//new 了不 delete} // 忘记 delete//指针被覆盖// 原内存丢失//️ new[] / delete 不匹配delete arr;// 应该 delete[]️//循环容器中持续 newfor (;;) {

fwfxhhx的博客 1140

JAVA的内存溢出和内存泄漏

在先前的博客中已经分析了JAVA对象内存分配,对象布局和对象访问定位,如果没有看过该博客的客官请移步。那么JAVA在运行过程中可能时时刻刻都在创建新的对象,那么在创建对象时如果没有分配到内存的时候会发生什么?首先可能会频繁的进行垃圾回收,如果回收的速度赶不上创建的速度,那么这时候当内存达到一定量时就会发生内存溢出。是指程序在申请内存时,没有足够的内存空间供其使用,出现OOM。

weixin_39555954的博客 3659

qt内存泄漏检测_qt 关于内存泄漏的检测

Qt 关于内存泄露的检测:工具篇关于Qt 内存泄露的检测工具有很多种,一下挑几种来说:1、检测已分配资源, 第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用按键 功能CTRL+ALT+SHIFT+A 显示已分配堆单元的数量CTRL+ALT+SHIFT+B 显示已分配的文件服务器资源的数量CTRL+ALT+SHIFT+C 显示已分配的窗口服务器资源的数量2、堆检测...

weixin_42526068的博客 2629
上一篇: 内存篇之静态与动态分配
下一篇: 内存篇之栈溢出
ipmux
博客等级 码龄24年 161粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值