问题定位:内存泄漏,踩内存。

1.内存泄漏

    确定现象:

     linux 内存泄漏,可以查看slabinfo 和另外一个proc下(貌似meminfo),关于内存的信息,可以看到内存是否在不断减少,以及减少的速度。

    vxworks系统,内存是否有相关信息???

    如果快速泄漏内存,则较容易判断。如果是非常慢的,则要经过一定时间场景复现后,应该也能看出来。

    linux在内存耗光后,会有log打印。容易判断。vxworks待试验。

 

    在确认存在内存泄漏后,如何确认泄漏源头?

    malloc做修改,使其记录相关信息 ---- 当前是否此功能。没有就当没说。

    复现场景。在什么场景下会泄漏,具体点,哪个任务在跑是会泄漏,由此确认。

 

【 具体方法补充】

Linux在内存使用上的原则是:如果内存充足,不用白不用,尽量使用内存来缓存一些文件,从而加快进程的运行速度,而当内存不足时,会通过相应的内存回收策略收回cache内存,供进程使用。

可通过对proc下进程相关的文件进行分析,精确评估系统消耗内存的大小,还可以对内存泄露类问题的解决提供一种定位手段。

一、系统总内存的分析

可以从proc目录下的meminfo文件了解到当前系统内存的使用情况汇总,其中可用的物理内存=memfree+buffers+cached,当memfree不够时,内核会通过回写机制(pdflush线程)把cached和buffered内存回写到后备存储器,从而释放相关内存供进程使用,或者通过手动方式显式释放cache内存:

echo 3 > /proc/sys/vm/drop_caches

通过cat /proc/meminfo 查看内存使用情况。

 二、进程使用内存的统计

在32位操作系统中,每个进程拥有4G的虚拟内存空间,其中0~3GB是每个进程的私有用户空间,这个空间对系统中其他进程是不可见的。3~4GB是linux内核空间,由系统所有的进程以及内核所共享的。通过访问/proc/{pid}/下相关文件,可以了解每个线程虚拟内存空间的使用情况,从而了解每个线程所消耗内存的多少。

由于我们的产品都是使用多线程方式实现的,多个线程共享一个进程的用户态虚拟地址空间,虚拟地址空间包含若干区域,主要有如下几个区域:

1、当前执行文件的代码段,该代码段称为text段。

2、执行文件的数据段,主要存储执行文件用到的全局变量,静态变量。

3、存储全局变量和动态产生的数据的堆。

4、用于保存局部变量和实现函数调用的栈。

5、采用mmap方式映射到虚拟地址空间中的内存段

所以只需要查看任意一个线程的用户态虚拟地址空间分配即可知道属于同一进程的所有线程占用总内存的大小。可以通过查看/proc/{pid}/maps文件来获取相关的虚拟地址空间内容

如果在实际的调试过程中,怀疑某处发生了内存泄露,可以查看该进程的maps表,看进程的堆段或者mmap段的虚拟地址空间是否持续增加,如果是,说明很可能发生了内存泄露,如果mmap段虚拟地址空间持续增加,还可以看到各个段的虚拟地址空间的大小,从而可以确定是申请了多大的内存,对调试内存泄露类问题可以起到很好的定位作用。

 

 

2.踩内存。

    1)预先分配的内存被踩。比如共享内存,axi_mem。有可能是其他核或当前核的不同启动阶段。

        先确认分配是否有问题,分配空间是否重叠。如果在边界,则重点怀疑相邻区域。

    也可能公共IP资源的寄存器,被胡乱修改,如果在当前核未做写操作时,寄存器被改“写”,则应该是其他核干的。

    2)系统内部,一个核的系统运行,普通的内存。

       不好弄。可以尝试打条件断点。被踩后错误的值是多少,合理的值是多少。

        是不是被自己模块内的数组越界等原因所踩。

如果是因为为初始化指针访问,导致向随机地址上写,不用太担心,因为更大可能是data abort。

  

 用处不大。。

 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java内存泄漏是指在程序运行过程中,由于程序设计不当或者其他原因,导致程序中的一些对象在没有被使用的情况下仍然占用着内存空间,这些对象无法被垃圾回收器回收,最终导致程序内存泄漏问题。下面介绍一些Java内存泄漏问题的调查定位方法。 1. 使用jmap命令 jmap是Java虚拟机自带的一个命令行工具,可以用来生成Java堆转储快照。使用jmap命令可以查看当前Java虚拟机堆内存中的对象分布情况,以及各个对象的数量和大小等信息。通过分析jmap生成的快照可以定位内存泄漏问题所在。 2. 使用jstack命令 jstack也是Java虚拟机自带的一个命令行工具,用于生成Java虚拟机当前线程的堆栈信息。当程序出现死锁或者线程阻塞等问题时,可以使用jstack命令查看当前线程的堆栈信息,以帮助定位问题所在。 3. 使用内存分析工具 除了使用命令行工具外,还可以使用一些内存分析工具来帮助定位内存泄漏问题。常用的内存分析工具有Eclipse Memory Analyzer(MAT)、VisualVM等。这些工具可以帮助我们分析Java堆转储快照,查找内存泄漏的原因,并提供针对具体问题的解决方案。 4. 定期检查代码 除了使用工具外,我们还应该定期检查程序的代码,发现并修复潜在的内存泄漏问题。常见的内存泄漏问题包括对象未被正确释放、缓存对象未被清理等。修复这些问题可以有效地避免内存泄漏的发生。 总之,Java内存泄漏问题的调查定位需要综合使用各种工具和方法,找到问题所在并及时解决。通过定期检查程序代码,加强对Java内存管理的理解和掌握,可以有效地预防和避免内存泄漏问题的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值