.NET内存释放
使用.net的人都知道托管代码并不需要我们手动来释放内存,只要对象出了作用域,GC会自动帮我们完成回收。
我写了个GPS数据收发的服务端程序,用到Socket,多线程同步。
现在已发布,测试运行中,上线的车辆有20台。24小时不间断运行了10来天,数据收发一切正常,现在的问题是该进程占用的内存越来越大。程序刚启动,等所有车连接上内存占用35M左右,过段时间(不到1个小时)内存降为20M左右(启动时候的资源被释放),然后就一路攀升,到现在达到131M,还在不断增长中。
我程序中非托管对象,如Socket,Stream,数据库的一些对象,都Close了。不存在非托管代码没有释放。废弃的线程也进行中断后,回收了。研究一天了,不知道如何下手,如何进行内存监控,查找原因(请知道的提供测试方法)。
我分析的可能原因有:
1,非托管资源虽然Close了,但程序中没有一处显示调用GC回收(这好像不会引起GC不能自动回收吧)
2,程序中有4,5个while(true)这样的线程+20个设备的长连接数据收发线程,也是(while(true)这样的)
{
//这些线程里有很多new外部类的操作,数据库操作
A a=new A();
}
线程函数每new一次A就会在堆中申请内存空间,a就会引用新的堆地址。但是线程函数没有出作用域(无限循环)之前a所引用的堆就不会被释放,是这样的吗?但是之前a所执行的堆没有被引用了啊,线程函数一直运行的情况下a所指向的堆会回收吗?
向我这样的多线程,Socket构架下引起内存不断增加的原因有哪些,请高手指点!请不要说使用异步,20台车不多,所以这样比较方便。。