当前位置: 技术问答>linux和unix
程序运行20分钟狂泻1G内存,当系统只剩5、6M内存时程序依然运行稳定(未使用交换分区),点解?
来源: 互联网 发布时间:2015-02-20
本文导语: 软件环境:Red Hat Linux 7.2 硬件平台:DELL PowerEdge 1400SC,PⅢ XEON 1.226 * 2,1G内存 程序运行前大约有900M可用内存,运行20分钟减少至只剩5、6M可用内存,但是系统仍能继续稳定运行,运行free指令查看系统内...
软件环境:Red Hat Linux 7.2
硬件平台:DELL PowerEdge 1400SC,PⅢ XEON 1.226 * 2,1G内存
程序运行前大约有900M可用内存,运行20分钟减少至只剩5、6M可用内存,但是系统仍能继续稳定运行,运行free指令查看系统内存使用情况,证明没有使用交换分区,不知何故?
另外,本来程序存在很严重的内存泄漏问题,使用Purify for Linux测试,发现并修改了55处能够引起内存泄漏的Bug,回归测试Purify没有发现内存泄漏,但是程序运行时内存仍然飞快减少。无奈后来采用添加测试代码的方法,跟踪每个类和结构的new和delete操作,发现每一个new出来的对象均delete了,包括new出来的char之类的内存也均被证明已经delete。
如果程序不存在内存泄漏为什么程序运行时系统的可用内存疯狂减少?如果存在内存泄漏的话为什么系统只剩5、6M可用内存时程序依然能够稳定运行?
怀疑与Linux的内存管理有关,于是查了查Linux内存管理策略,没有找到满意的答案;(
请大侠给点儿启示,谢谢!!!
硬件平台:DELL PowerEdge 1400SC,PⅢ XEON 1.226 * 2,1G内存
程序运行前大约有900M可用内存,运行20分钟减少至只剩5、6M可用内存,但是系统仍能继续稳定运行,运行free指令查看系统内存使用情况,证明没有使用交换分区,不知何故?
另外,本来程序存在很严重的内存泄漏问题,使用Purify for Linux测试,发现并修改了55处能够引起内存泄漏的Bug,回归测试Purify没有发现内存泄漏,但是程序运行时内存仍然飞快减少。无奈后来采用添加测试代码的方法,跟踪每个类和结构的new和delete操作,发现每一个new出来的对象均delete了,包括new出来的char之类的内存也均被证明已经delete。
如果程序不存在内存泄漏为什么程序运行时系统的可用内存疯狂减少?如果存在内存泄漏的话为什么系统只剩5、6M可用内存时程序依然能够稳定运行?
怀疑与Linux的内存管理有关,于是查了查Linux内存管理策略,没有找到满意的答案;(
请大侠给点儿启示,谢谢!!!
|
这个问题你不用担心,我想这也是linux区别于win的地方,linux尽量利用物理内存空间。
我的内存为512m,我用mysql特意大批量增加临时内存表,最后当内存需求达到3G时,此时物理内存用到近98%,交换区用了90%以上,此时系统性能还是非常的好!因此我认为,无需担心linux的内存管理,不过增加交换区应该是有用处的。
我的内存为512m,我用mysql特意大批量增加临时内存表,最后当内存需求达到3G时,此时物理内存用到近98%,交换区用了90%以上,此时系统性能还是非常的好!因此我认为,无需担心linux的内存管理,不过增加交换区应该是有用处的。
|
我觉得这个可能是创建子进程方面的问题,看看创建的子进程有没有全部正常结束,否则的话它占据的内存是不会释放的。我们以前遇到过这种情况,编了一个java程序,分明进程已经结束了,可是在进程列表还能看到它的子进程(僵尸状态),而且还继续占有着内存。
|
Using 'top' or 'ps' to view the memory used by this process.
The displayed free memory of system by 'free' means nothing.
The displayed free memory of system by 'free' means nothing.
|
我在7.3里面也发现过类似的问题,程序起来之后,我用sar -r看内存,发现每隔几秒就少几百k,
吓了我一跳。后来重启系统,没启动我的程序,用sar -r 看,还是每隔几秒,少几百k.
所以,我猜可能和应用程序无关。
吓了我一跳。后来重启系统,没启动我的程序,用sar -r 看,还是每隔几秒,少几百k.
所以,我猜可能和应用程序无关。
|
请注意:你要观察的是你的程序使用了多少内存,而 不是 系统还有多少内存,因为linux的磁盘子系统会 自动 的使用可以使用的内存作为buffer,而当内存不够的时候又会 自动 的释放一些内存。如果你的程序有较多磁盘操作,你的测试并不能说明什么的...
|
linux下,当内存够用的时候它是不会使用交换分区的,它也一直不会调用kswapd
而且一旦装入内存的程序也不需要再从磁盘调用,除非有更改
我有次不小心在系统根目录下#rm -rf *了,系统几乎没剩几个文件,但是X windows一样使用mozilla关掉就不能再打开了
而且一旦装入内存的程序也不需要再从磁盘调用,除非有更改
我有次不小心在系统根目录下#rm -rf *了,系统几乎没剩几个文件,但是X windows一样使用mozilla关掉就不能再打开了
|
实际上Linux的开发者不希望太多的“可用内存”闲置起来,在应用程序不使用的时候,系统就把它用做cache和buffer;当程序需要使用这些内存时,再还给它们。
所以,从内存管理上,Linux要比Win高明得多。
所以,从内存管理上,Linux要比Win高明得多。
|
和MS SQL Server有的一比了,哈哈
|
up