小弟写了一C# 多线程socket服务器,运行一段时间以后,物理内存只有几十M,而虚拟内存高达几百M,最终程序会崩溃。小弟百思不得其解,求各位高手解惑。
程序使用几个全局的ArrayList存储用户数据,并一直在写本地硬盘的txt文件作为log。写LOG操作以后,System.IO.StreamWriter对象我是关闭了的。另数据库入库调用的DLL组件后,System.Data.SqlClient.SqlConnection对象也关闭了的。
代码太长,无法帖出来,请见谅。
如果分不够,问题解决了还可以再加。
程序使用几个全局的ArrayList存储用户数据,并一直在写本地硬盘的txt文件作为log。写LOG操作以后,System.IO.StreamWriter对象我是关闭了的。另数据库入库调用的DLL组件后,System.Data.SqlClient.SqlConnection对象也关闭了的。
代码太长,无法帖出来,请见谅。
如果分不够,问题解决了还可以再加。
请问具体哪些资源数据非托管资源呢?又如何回收?有资料或者简单的例子都行,我是新手学习中,对C#的理解很不深刻。谢谢关注。
System.IO.StreamWriter
System.Data.SqlClient.SqlConnection
都是非托管资源,这些对象使用后,只执行了对象自带的close() 操作有问题吗?
socket 使用后,执行了 shutdown () 和 close ()操作
怎么听lz的意思好像是物理内存没怎么使用了。lz,你是如何判断出物理内存使用少,而虚拟内存使用多的呢?
是不是定时执行这个:
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()
{
}}