技术开发 频道

减少.NET应用程序内存占用经验分享

  在发布的时候,最好将默认的动态库配置修改为静态库,这样VS会把依赖的相关C++库打包到生成的dll中,部署到客户机器上不会出现问题。SecuData类库项目的属性设置如下图:

.Net内存占用总结

  改成这种P/Invoke模式之后,10M数据载到内存中,内存占用只有10M左右,较之前采用.NET的30-40M的内存又降低了很多,而且内存波动比较小,满足了对内存占用的要求。

  采用这种“混搭”方式有一些好处,既有.NET的快速开发,又有C++的灵活的内存分配销毁模式以及代码安全性保护。在很多时候,可以将一些对内存占用比较敏感,大数据量的处理逻辑,放在C++中处理,利用灵活的手动内存管理模式降低这部分的内存占用;将核心的数据结构及算法使用C++编写,可以提高代码的安全性,提高程序的反编译难度。

  四、结语

  .NET应用程序由于需要加载CLR及一些通用类库,并且具有垃圾收集机制,较其他本地语言如C,C++具有较大的footprint,使用.NET创建一个简单的Winform可能就会占用近10M的内存,所以随着开发的进行,内存占用会比较大。当然这些在很多时候是由于开发者自身对.NET底层机制不熟悉,比如在有些地方可以使用值类型而使用引用类型;创建了大量的临时的周期比较短的对象;使用了过多的静态变量及成员导致内存被长久占用而得不到回收;以及.NET内部的一些机制,比如集合对象会在内部预先分配多余的空间等等。很多时候因为有.NET的GC机制,使得我们不必去关注对象的销毁而很”大方”的去创建新对象,去使用一些重型的内置对象,从而导致内存占用过大。解决好这些问题,其实可以降低.NET应用程序的相当大一部分的不必要的内存占用。

  除了了解.NET框架的一些内部机制之外,良好的思路,高效数据结构和算法也可以使得问题变得简单而减少内存的开销。

  最后对于对内存要求比较敏感,可以利用C/C++的手动的灵活的内存管理语言来编写相应模块,在.NET中采用P/Invoke技术进行调用来减少一些内存。

  以上是我对降低.NET应用程序内存占用的一点儿实践和总结,希望对您有所帮助。

0
相关文章