.Net内存优化的几点经验
以前从来没有想过.Net开发居然存在内存无法释放的问题,总是认为GC给我处理好了一切。现在GIS二次开发结合三维球开发,没有想到存在如此严重的内存增长,很快内存就不够用了,导致系统各种不稳定。球体和三维模型就开始闪烁,出现无法创建D3D或GDI+设备,OutOfMemory等错误。最近一直为内存优化的事情头疼,虽然优化了部分内容,问题依然没有解决。
还是总结了一下最近优化的经验:
1.慎重使用单例,单例会始终保持一个静态对象的引用,内存始终不释放,同时单例类的所有成员变量也不会释放。如单例窗体,解决方法是在Dispose方法中将静态引用置为null。
2.字符对象使用不当:过多太长字符串,占用大对象堆;同时尽量不使用字符串加,改用StringBuilder
3.流对象没有关闭。如文件流,网络传输流(HttpResponse,FtpResponse)
4.坑人的Select * from XX,应该避免使用这种代码,尤其是有Blob字段时候。
5.读取文件和流时避免new 过大的byte数组,应该分段读取。
6.事件的挂接。有两种情况:
A对象作为参数传入B对象,在B对象中为A挂接了事件,如果没有正确移除事件,会导致B对象内存无法回收。例如B为窗体变量,B被Dispose后,内存仍然不会回收。
A对象通过B的方法获取对象C,而C在B中挂接了事件,此时即使将B设为null,也无法将B对象的实例内存回收。
7.关于COM,目前项目中大量使用了COM组件,包括DEV、ArcEngine、Slimdx封装的Direct3D、Excel Interop、FlexCell.Net。
感觉COM,总是内存不释放!不知道怎么回事,即使调用了Marshal.FinalReleaseComObject(),或者Marshal.ReleaseComObject(),感觉RCW的终结器始终没有被调用。ArcEngine在新建图层、删除图层、查询会有显著的内存增长,而且内存第一次明显增长,以后会缓慢增长,增长之后不会释放。
造成的问题还包括启动读取xls文件的Excel.exe进程无法关闭、WorkspaceFactory占用影像tiff文件,提示文件被另外一个进程占用,无法删除。
Excel进程关闭可以通过如下的方法解决,在使用完读取写入的方法后调用。
对于GC.Collect()方法,在确定已经有大量对象被置空时,可以手工调用。参考文章
WorkspaceFactory占用影像tiff文件也可以通过释放RCW来解决,但是内存没有办法释放。
public void Quit()
{
try
{
_Application.Quit();
if (_Range != null)
{
Marshal.FinalReleaseComObject(_Range);
_Range = null;
}
if (_Worksheet != null)
{
Marshal.FinalReleaseComObject(_Worksheet);
_Worksheet = null;
}
if (_Workbook != null)
{
Marshal.FinalReleaseComObject(_Workbook);
_Workbook = null;
}
if (_Workbooks != null)
{
Marshal.FinalReleaseComObject(_Workbooks);
_Workbooks = null;
}
if (_Application != null)
{
Marshal.FinalReleaseComObject(_Application);
_Application = null;
} }
catch { }
GC.Collect();
GC.WaitForPendingFinalizers();
}
希望大家给我点建议。
.Net内存优化的几点经验的更多相关文章
- Unity3D 游戏开发之内存优化
项目的性能优化主要围绕CPU.GPU和内存三大方面进行. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题.就目 ...
- 大礼包!ANDROID内存优化(大汇总)
写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...
- ANDROID内存优化——大汇总(转)
原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...
- 【转】Android开发之Bitmap的内存优化详解
本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...
- 解析Android开发优化之:对Bitmap的内存优化详解
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
- Android开发优化之——对Bitmap的内存优化
http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...
- ANDROID内存优化(大汇总——中)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- android 内存优化一
常见内存泄露原因 Context对象泄漏 1.如果一个类持有Context对象的强引用,就需要检查其生存周期是否比Context对象更长.否则就可能发生Context泄漏. 2.View持有其创建所在 ...
- 对Bitmap的内存优化
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
随机推荐
- 禁止用户自己停止SEP - 飞舞的菜刀 - 51CTO技术博客
员工在自己的工作站上,右键点击状态栏SEP图标,停止SEP服务,导致管理员定制的策略失效,针对上述情况,请安装下述方法操作. 1. 打开SEPM. 2. 在[策略]里选中你所使用的[防病毒和防间谍软件 ...
- 在CSV文件中增加一列属性值
具体参见:系统管理\将文件夹复制到列表中的远程主机 修改前: column1, column2 1,b 2,c 3,5 修改后: column1, column2, column3 1,b, ...
- NSQ:分布式消息队列学习记录
参考资料: NSQ:分布式的实时消息平台 初识NSQ分布式实时消息架构 深入NSQ之旅 nsq topic和channel的区别
- HTTP POST, PUT PATCH
POST = 新增 GET = 讀取 PUT = 更新 DELETE = 刪除 PUT 会在地址栏显示参数信息,不安全! 理解POST和PUT的区别,顺便提下RESTfu 这两个方法咋一看都可以更新资 ...
- Web Service性能测试方案
目录: 1.web Service简介 2.SoapUI介绍 3.使用SoapUI进行web service性能测试 4.使用LR进行web service性能测试 5.使用JMeter进行web s ...
- DOM下的节点属性和操作小结
属性: 1 .nodeName 节点名称,相当于tagName.属性节点返回属性名,文本节点返回#text.nodeName,是只读的. 2 .nodeType 值:1,元素节点:2,属性节点:3,文 ...
- 线性表集合A=A B
大话数据结构 void union(List *a, List Lb) { int La_len, Lb_len, i; ElemType e; La_len = ListLength(La); Lb ...
- Flink Internals
https://cwiki.apache.org/confluence/display/FLINK/Flink+Internals Memory Management (Batch API) In ...
- servlet等一些砸碎的
1:servlet 中的synchronized 关键字能保证一次只有一个线程 2:servlet的线程问题只有在大量的方位时 3:AutoCloseable接口:资源自动关闭 4:EntityUti ...
- 一个比较轻巧好用的js分页插件,可ajax可url
var pageNav = pageNav || {}; pageNav.fn = null; pageNav.pre = "pre"; pageNav.next = " ...