linux内存分配缺陷,Linux系统优化-内存错误分析

造成内存错误的样例分析

例一:(释放代码段空间导致内存错误)

231464bc05afc2cb18b84064290d3320.png

图1  Coding

运行错误显示:

5cf3f9d6f8d17f2cf46af70fce1b99f7.png

图2内存错误显示

分析:如图2所示运行后出现内存错误,free(): invalid pointer: 0x08048540 ***。打印出指针P的地址可以看出如图3,P的地址发生了变化,通过malloc分配的指针P地址在堆区,但是经过字符串给P再赋值后,P的地址变成了代码段存放的地址

ed8bceac5ed29e7b4cb1fa0f6441b010.png

图3指针P的地址

840f31decda3a625f814d2365fefb4c8.png

图4进程运行内存显示

释放了一个代码段的内存就导致了内存的错误,并非堆内存。

样例二(释放没有申请空间的指针导致内存错误)

1448e5943ae4e20419571f84c63734ca.png

图5 Coding

内存错误显示

4aa455009c602f9caf83a60d92e65d38.png

图6内存错误显示

分析:如图6所示,运行后内存错误显示。如图7所示声明并定义一个char  *p,并未为其分配空间,打印P的地址可以看出位于第一个动态链接库加载的地址处。改指针并未申请空间。

17e6a45ba3a6f423a7b39104bc4417e2.png

图7指针P地址

60fd6020ff3f79306706b5af8dfed409.png

图8进程运行内存显示

样例三 (释放已经释放的指针)

d3d4c8097fb3013ff91d349156948948.png

图9 Coding

129bfb8ea6a2e24dd44b3d93252a0fa7.png

图10运行错误显示

分析:错误提示double free corruption (fasttop):0x09303008,即释放了一个已经释放了的内存空间。

样例四(释放了栈空间变量)

1200562975a18fd4a75def3040895825.png

图11  Coding

9bdd89ebe99dcd342c5af4db3f2d63ff.png

图12内存错误

分析:声明了一个int指针,并将变量a的地址赋予P,然后释放P的空间。由上图分析可得,P的地址为0xbfe6ec5c,通过显示的Memory map可以看出,p指向的是栈空间。由于free了栈空间,导致了内存错误。

内存泄露原因

内存泄露通常分为四类:(根据发生的方式)

1.常发性内存泄露。造成内存泄露的代码会被多次执行,每次代码被执行时都会导致一块内存泄露。

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

3.一次性内存泄露。造成内存泄露的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且只有一块内存发生泄露

4.隐式内存泄露。程序在运行过程中不断地分配内存,但是直到结束时候才释放内存。确切地说这里并没有发生内存泄露,因为程序最终释放了所有申请的内存。但是对于一个服务器程序来说需要需要长时间连续不间断运行,有时几个月甚至几年。如果不及时释放内存可能会导致最终耗尽系统的所有内存。

堆内存优化

1.堆内存最小单位为16字节所以应尽量减少小块内存的申请,避免内存浪费

2.调整M_MMAP_THRESHOLD,降低mmap的门槛,会降低内存空洞的风险,但也会增加系统调用,降低性能。

3.调整M_TRIM_THRESHOLD,减少堆顶连续内存门槛,释放更多的堆顶内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值