C#程序物理内存不大而虚拟内存用过大的问题?

josea 2009-03-03 11:15:27
小弟写了一C# 多线程socket服务器,运行一段时间以后,物理内存只有几十M,而虚拟内存高达几百M,最终程序会崩溃。小弟百思不得其解,求各位高手解惑。
程序使用几个全局的ArrayList存储用户数据,并一直在写本地硬盘的txt文件作为log。写LOG操作以后,System.IO.StreamWriter对象我是关闭了的。另数据库入库调用的DLL组件后,System.Data.SqlClient.SqlConnection对象也关闭了的。
代码太长,无法帖出来,请见谅。
如果分不够,问题解决了还可以再加。
...全文
735 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
atlantis141 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vrhero 的回复:]
物理内存占用不大虚拟内存占用很大的原因是Cache命中率很低...也就是说你常驻内存的数据变动很频繁...

看看那几个全局的ArrayList...优化一下...
[/Quote]
豁然开朗,但是还是没有办法解决问题
美福种田伯 2009-03-04
  • 打赏
  • 举报
回复
把最后的处理结果告诉大家哈,我也很关注这个问题
zhujiechang 2009-03-04
  • 打赏
  • 举报
回复
内存泄露
josea 2009-03-04
  • 打赏
  • 举报
回复
谢谢大家的回帖,总结出来2个方面的问题。
1。是有内存泄露
2。是缓存命中太低。
我会从这2个方面着手。
josea 2009-03-03
  • 打赏
  • 举报
回复
查了一些资料,得知
System.IO.StreamWriter
System.Data.SqlClient.SqlConnection
都是非托管资源,这些对象使用后,只执行了对象自带的close() 操作有问题吗?
socket 使用后,执行了 shutdown () 和 close ()操作
devilli 2009-03-03
  • 打赏
  • 举报
回复
你加几个GC();试试吧
josea 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hbxtlhx 的回复:]
ArrayList存储的内容太大了?

只跟据提供的信息看不出什么问题,可能是你的程序有使用到很多非托管的资源而没有释放。
[/Quote]
目前只有几百个用户,内用不会太大吧。程序物理内存最大也只有100多M,然后会自己回收到几十M。但是虚拟内存回收不了。
请问具体哪些资源数据非托管资源呢?又如何回收?有资料或者简单的例子都行,我是新手学习中,对C#的理解很不深刻。谢谢关注。
北京的雾霾天 2009-03-03
  • 打赏
  • 举报
回复
ArrayList存储的内容太大了?

只跟据提供的信息看不出什么问题,可能是你的程序有使用到很多非托管的资源而没有释放。
天乐 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hetl_1985 的回复:]
引用 10 楼 agentianle 的回复:
估计是有内存泄露了,详细看看有没有不用的对象却一直没有释放对其的引用的

不是吧
[/Quote]

我遇到过的,集合用多了,有时候会忘了清除的,逻辑复杂时,偶尔会有的

解决过一个类似的问题,就是因为内存泄露

不要掉以轻心啊,内存泄露不是c/c++的专利
anna10 2009-03-03
  • 打赏
  • 举报
回复
up
宝_爸 2009-03-03
  • 打赏
  • 举报
回复
那就是有泄漏了。

不过C#有自己的垃圾收集机制,因此比较大的可能性是,你的全局变量,尤其是数组,原来越大。

我们单位原来有个程序使用enterprise library就有这个问题,写的时候没注意,最后根本没法解决。
悔说话的哑巴 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 agentianle 的回复:]
估计是有内存泄露了,详细看看有没有不用的对象却一直没有释放对其的引用的
[/Quote]
不是吧
josea 2009-03-03
  • 打赏
  • 举报
回复
to vrhero :
是不是定时执行这个:
Arraylist1//全局变量存储
private void ClearMemory()
{
try{
ArrayList ArrayList2=new ArrayList();
lock(Arraylist1)
{
for (int i=0;i<ArrayList1.Count;++i)
{
ArrayList2.add(ArrayList1[i]);
}
ArrayList1.clear();
for (int i=0;i<ArrayList2.Count;++i)
{
ArrayList1.add(ArrayList2[i]);
}
ArrayList2.clear();

}
}
catch()
{
}

}
jlj84237485 2009-03-03
  • 打赏
  • 举报
回复
帮顶一下
vrhero 2009-03-03
  • 打赏
  • 举报
回复
变动比较频繁的数据不太适合常驻内存...你可以试试定时清理一下,清空再重新加载释放内存...
天乐 2009-03-03
  • 打赏
  • 举报
回复
估计是有内存泄露了,详细看看有没有不用的对象却一直没有释放对其的引用的
josea 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 findcaiyzh 的回复:]
我怎么看糊涂了。通常程序没法管理物理内存和虚拟内存。C#就更不行了。

物理内存和虚拟内存是操作系统管理的,应该是物理内存不够了,才会交换到硬盘上的虚拟内存。
怎么听lz的意思好像是物理内存没怎么使用了。

lz,你是如何判断出物理内存使用少,而虚拟内存使用多的呢?
[/Quote]

程序开始运行的时候,物理内存和虚拟内存基本同样大,3、5天以后,任务管理器查看物理内存还是和原来差不多,但是虚拟内存就几百M了
josea 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vrhero 的回复:]
物理内存占用不大虚拟内存占用很大的原因是Cache命中率很低...也就是说你常驻内存的数据变动很频繁...

看看那几个全局的ArrayList...优化一下...
[/Quote]
能指点下思路吗?如何优化呢?我的ArrayList的数据确实变动比较频繁。
宝_爸 2009-03-03
  • 打赏
  • 举报
回复
我怎么看糊涂了。通常程序没法管理物理内存和虚拟内存。C#就更不行了。

物理内存和虚拟内存是操作系统管理的,应该是物理内存不够了,才会交换到硬盘上的虚拟内存。
怎么听lz的意思好像是物理内存没怎么使用了。

lz,你是如何判断出物理内存使用少,而虚拟内存使用多的呢?
vrhero 2009-03-03
  • 打赏
  • 举报
回复
物理内存占用不大虚拟内存占用很大的原因是Cache命中率很低...也就是说你常驻内存的数据变动很频繁...

看看那几个全局的ArrayList...优化一下...
加载更多回复(1)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧