Linux系统优化-内存错误分析
Linux系统优化-内存错误分析
Linux系统优化-内存错误分析
为什么80%的码农都做不了架构师?>>>
造成内存错误的样例分析
例一:(释放代码段空间导致内存错误)
图1 Coding
运行错误显示:

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

图3 指针P的地址

图4 进程运行内存显示
释放了一个代码段的内存就导致了内存的错误,并非堆内存。
样例二(释放没有申请空间的指针导致内存错误)
图5 Coding
内存错误显示

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

图7 指针P地址

图8 进程运行内存显示
样例三 (释放已经释放的指针)

图9 Coding

图10 运行错误显示
分析:错误提示double free corruption (fasttop):0x09303008,即释放了一个已经释放了的内存空间。
样例四(释放了栈空间变量)

图11 Coding

图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,减少堆顶连续内存门槛,释放更多的堆顶内存。
转载于:https://my.oschina.net/mjRao/blog/119666
Linux系统优化-内存错误分析相关教程
-
Bootstrap——栅格系统的简单使用
Bootstrap——栅格系统的简单使用 Bootstrap——栅格系统的简单使用 什么是栅格系统 栅格系统的基本使用 栅格嵌套 利用栅格系统进行网页布局 什么是栅格系统 Bootstrap包含了一套响应式、移动设备优先的流式栅格系统。利用Bootstrap,我们可以快速地完成页面
-
鸿蒙系统 OLED屏幕驱动
鸿蒙系统 OLED屏幕驱动 Hi3861 OLED驱动 可以看附件视频详细说明 Hispark WiFi开发套件又提供一个oled屏幕,但是鸿蒙源码中没有这个屏幕的驱动,我们需要自己去移植。 经过一晚上的调试,现在终于在鸿蒙系统上实现OLED屏幕的显示了,效果如下: 这里记录一下
-
用python编写名片系统时遇到的import f.py导入命令,与from f.py
用python编写名片系统时遇到的import f.py导入命令,与from f.py import *区别及问题 先说问题 :用import f.py导入命令时,在card_main.py中,会先出现提示用户进行操作的信息,再出现之后的功能函数(如功能【1】新建卡片),如图1 但是用from f.py import
-
kali vmware linux上不了外网nat配置正确dns不行数字网址可以出
kali vmware linux上不了外网:nat配置正确,dns不行,数字网址可以出去,如何解决vmware的kali改成桥接模式,ok成功了 1、nat一直玩,无非就是window的互联网共享给vm8 2、虚拟机虚拟网络设置网关设成vm8即可 3、可是发现dns怎么设置都不行,光猫里设置的是
-
毕业季,我的Linux求职之路
毕业季,我的Linux求职之路 秋招终于告一段落了,本硕的七年求学之路也快画上了句号。回首求职的这一段日子,痛苦并快乐着。感谢所有陪伴着我走过这一段路程的同学,所有的辛酸都值得铭记。求职的过程中在网上看了很多的求职经验,现在想写一篇文章总结一下自
-
Linux系统下安装配置 OpenLDAP + phpLDAPadmin
Linux系统下安装配置 OpenLDAP + phpLDAPadmin 实验环境: 操作系统:Centos 7.4 服务器ip:192.168.3.41 运行用户:root 网络环境:Internet LDAP(轻量级目录访问协议)是一个能实现提供被称为目录服务的信息服务,也是一套用户认证体系系统;一般在大型企业
-
重装windows后ubuntu系统启动菜单不见的修复方法
重装windows后ubuntu系统启动菜单不见的修复方法 为什么80%的码农都做不了架构师? 当我们原来系统中有ubuntu的时候,如果我们重装或安装新的windows系统时,会发现ubuntu系统启动菜单不见啦,我们重现安装ubuntu系统也可以解决这个问题,但是我们以前在ubunt
-
在Linux中如何运行c++文件
在Linux中如何运行c++文件 在Linux中如何运行c++文件 首先安装必要的工具和编译器来运行代码。 gcc(GNU编译器套件)简介: GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如li