.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异常.所以,对于图 ...
随机推荐
- JavaScript的My97Date日期工具类的使用
开发人员最喜欢的事情就是有工具然后拿来直接使用(. ~ .) 使用截图: 1.设置input标签 2.根据其DEMO文件,引入,进行事件处理 3.效果如图 4.效果如图 代码: <!DOCTYP ...
- Js组件的一些写法【转】
首先看下Prototype里的写法: var Class = { create: function() { return function() { this.init.apply(this, argu ...
- ci调用application/views下的css,js,图片资源出现You don't have permission to access CodeIgniter on this server解决
原因是view文件下面有个.htaccess文件,里面写的是 Deny from all //拒绝所有请求 自己本地测试的话,就直接去掉,放到服务器就指定application/views文件 ...
- github 向导/介绍
环境:windows 7 64bit 阅读了http://guides.github.com的教程. 流程 git是协作版本管理的一种方法.工作流程是在一个主线基础上发展分支(branch),最后并入 ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式
用于 linux 执行 crontab 命令生成缓存的文件 crop.php <?php //让crontab 定时执行的脚本程序 require_once 'db.php'; require_ ...
- UDP 构建p2p打洞过程的实现原理(持续更新)
UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55) 阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...
- nginx服务器安装与启动
nginx服务器介绍 1.nginx服务器功能 nginx服务器可以扮演:轻量级的web服务器.应用服务器.代理服务器.反向代理服务器.后台服务器.CDN缓存服务器 nginx的基本模块: 内核模块C ...
- cascading rollback 级联回滚
Computer Science An Overview _J. Glenn Brookshear _11th Edition To emphasize the delicate nature of ...
- kudu
Kudu White Paper http://www.cloudera.com/documentation/betas/kudu/0-5-0/topics/kudu_resources.html h ...
- Java:按值传递还是按引用传递详细解说
前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有 ...