Chinaunix
标题:
fstream 内存系统管理的问题/内存泄漏?
[打印本页]
作者:
senic
时间:
2008-12-14 14:26
标题:
fstream 内存系统管理的问题/内存泄漏?
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream _file;
long i = 0;
_file.open("test.log", ios:
ut);
if(_file.good())
{
cout << " test.log open ok" << endl;
}
else
{
cout <<"test.log open err" << endl;
}
while(1)
{
_file << "------------------------------------------------------" << endl;
i++;
//_file.flush(); 跟flush无关 加了之后情况一样
if (i > 10000000)
{
break;
}
}
_file.close();
return 0;
}
虚拟机上的Red Hat Linux 7.1 3.0.1-3 (在真实系统环境里 也会出现同样情况)
g++ -v:
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.0.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --host=i386-redhat-linux
Thread model: posix
gcc version 3.0.2 20010905 (Red Hat Linux 7.1 3.0.1-3)
uname -r:
2.4.7-10
问题是在我在开发服务端程序时 定位到 只要程序执行写文件命令 系统当前可用内存 就会不断下降 ......
无论程序是kill掉 还是正常return退出 可用内存都无法恢复......
于是写了上面的测试程序 可用内存占用情况依旧..... 不过只要将写的日志文件删除 就会出现可用内存的大幅度下降
执行完程序然后删除日志 可用内存只在执行前的基础上增加了28k
然后搜索了一下网上关于fstream内存泄露方面的信息 都没有很好的解决方案 google唯一有点有意义的建议就是 使用stringstream....(没用过)
特向各位高手请教 ,因为在服务器上跑的程序 都是要保存几个月的 不可能写完了就删 来恢复.....
[
本帖最后由 senic 于 2008-12-14 15:03 编辑
]
作者:
hr_it
时间:
2008-12-14 14:39
fstream 还会导致内存泄漏??? 占个位等高手来解说
作者:
senic
时间:
2008-12-14 14:42
[root@localhost ~]# g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-cpu=generic --build=i386-redhat-linux
Thread model: posix
gcc version 4.3.0 20080428 (Red Hat 4.3.0-
(GCC)
刚才在 新一点的环境和编译器 也试了一下 不删除文件 可用内存也被占用
作者:
senic
时间:
2008-12-14 15:12
刚才又把 测试代码 拿到xp上 用dev c++编译跑了一下
程序内存占用和 PE使用都是定值 未现大波动 .........
是操作系统 内存管理机制的问题?
作者:
Fixend
时间:
2008-12-14 15:49
这个是linux文件系统的缓存机制。
不必在意这点内存的,系统会管理好。
作者:
langue
时间:
2008-12-14 15:57
标题:
回复 #4 senic 的帖子
你写 的中 文 里面有 很多 空格
检查 内存泄漏 需要用专门的方法
光 盯着top看 是看不出来的
作者:
timespace
时间:
2008-12-14 15:59
linux会用空闲内存做buffer cahe,和“内存泄漏”没任何关系。写文件时,vmstat可以看到buffer cache的增加,而top监控进程虚拟内存时应该变化不大
作者:
senic
时间:
2008-12-14 16:35
其实 在实际环境中 服务端我已经跑了 2个多月 也并没有发现内存不足 程序当掉的问题
程序开发完成之前也用valgrind检测过 ok了 才放上去的.
但是给客户交货的时候 别人都会提出这个内存问题 不好解释.... 别人就看top结果...
同机也有其他的应用程序 同样是每天大并发量的处理
由于日志都是通过我的程序保存(每天1-1.5G日志) ,所以在top结果上看来 跑了我的程序系统可用内存就直线下降
如果没有其他的办法 干脆也不保留日志 直接socket丢windows上去 或者开个ftp server 按小时备份了就删除..... 哈 郁闷
btw: 写日志模块我记得朋友之前在 rh as3上面 同样写大量日志 没有这种情况 ---- 呵呵 可能是这个原因 个人版和服务器版的区别吧
作者:
senic
时间:
2008-12-14 16:37
标题:
回复 #5 Fixend 的帖子
呵呵 别人2g的服务器 就因为跑了我的程序 可用内存显示一直在最低的 5m左右徘徊挣扎
说不过去
作者:
senic
时间:
2008-12-14 16:47
谢谢各位的热心回复
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2