.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异常.所以,对于图 ...
随机推荐
- Java发展史之Java由来
Java:由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- 如何用JavaScript在页面上显示一个时间钟表
<html><head><script type="text/javascript">function myTime(){var today=n ...
- 项目部署到Tomat报错:jar not loaded.See Servlet Spec 2.3, section 9.7.2. Offending
项目部署到Tomcat报这样的异常: Java代码 jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: ja ...
- Apache Storm技术实战之2 -- BasicDRPCTopology
欢迎转载,转载请注明出处,徽沪一郎. 本文通过BasicDRPCTopology的实例来分析DRPCTopology在提交的时候, Topology中究竟含有哪些内容? BasicDRPCTopolo ...
- mysql数据库‘复制’的办法
mysql数据库‘复制’的办法 2006-01-17 10:36:00 标签:Mysql SQL 数据库 休闲 职场 >mysqldump wap -u root -ppassword --ad ...
- xampp默认mysql密码设置,修改mysql的默认空密码
xampp默认mysql密码设置,修改mysql的默认空密码 分类: xampp2012-09-12 11:24 30264人阅读 评论(5) 收藏 举报 mysqlphpmyadminauthent ...
- 浅谈XML
什么是 XML? · XML 指可扩展标记语言(EXtensible Markup Language) · XML 是一种标记语言,很类似 HTML · XML 的设计宗旨是传输数据,而非显示数据 · ...
- jq tab
<div id="outer"> <ul id="tab"> <li class="current">t ...
- php://input,$_POST,$HTTP_RAW_POST_DATA区别
我们先来看两个demo 例子:php://input 代码如下 post.php 代码如下 例子:$_post 代码如下 welcome.php 代码如下 再来看$GLOBALS [& ...