C# 调用dll 内存增大

aikeli1234567 2010-07-21 10:29:01
外包图像处理给的dll文档,我这边使用C#调用,参数使用的是三色Byte数组,我这边传入原图的三色数组,然后得到处理完成后的三色数组值,再合成新的图片。问题是,每当我调用dll的处理函数时,内存就增长5M多,外包那边使用的是VC++开发的,他们使用MFC开发的测试程序处理过程中内存几乎没有增长,由于图片不确定处理次数,程序使用时,很快就内存不足了!请教高手有没有解决方案,对C#内存释放有帮助也好!GDI+对象释放,GC,我都使用了,只是释放了一点点!请教精通C#高手!
...全文
311 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aikeli1234567 2010-07-29
  • 打赏
  • 举报
回复
谢谢您的分析,我再试试你的说的方法
cuike519 2010-07-29
  • 打赏
  • 举报
回复
从你提供的信息来看,应该是内存泄漏了。
首先你需要确定是什么内存泄漏了,查看内存泄漏的工具很多,比如容易上手的AQtime,如果没有就用windbg+性能监视器。
如果内存增长成规则变化,问题相对简单点,你可以通过windbg找到大小为每次泄漏内存大小的对象(也许是一组对象)。如果单从观察计数器无法分析出泄漏的对象的大概内容,则可以需要通过性能计数器的日志功能来记录每隔一个时间间隔的性能变化,这里你需要添加有关内存的几个计数器,托管的和非托管的都要。日志可以记录连续的性能分析结果,你可以通过这个来缝隙“动态”情况。

同时你可能需要在发生内存泄漏的时候dump内存快照来进一步分析具体泄漏的对象。具体使用方法可以参考windbg的adplus命令。

通过分析dump几乎可以找到所有的内存泄漏(只是工作量的大小而已)。

找到内存泄漏的对象之后,你可能需要知道为什么泄漏,为什么没有被回收,这时候你你可以通过!gcroot命令来查看这个对象的根是谁,找到了根就知道为什么不会被GC回收了。

上面是分析过程,如果楼主有心可以自己操练一下。

针对楼主的问你,你看看是否在线程存储区上保存数据了(这种情况通过上面的方法也可以分析出来)?

.NET里面没有直接销毁对象的方法,如果不再使用显式的设置为null,这样这个引用就和对象之间断开连接了,垃圾回收再次运行的时候会把那个对象回收的(实际上不是简单的删除)。
aikeli1234567 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 li45214521 的回复:]
估计 是你的数组没有重用 ,每次穿入都是使用New出来的数组吧
[/Quote]
是啊,每次都是定义新的Byte数组,但是我不知道怎么将Byte数组进行销毁啊
li45214521 2010-07-28
  • 打赏
  • 举报
回复
估计 是你的数组没有重用 ,每次穿入都是使用New出来的数组吧
aikeli1234567 2010-07-28
  • 打赏
  • 举报
回复
问题在于他那边使用VC++开发的测试程序内存没有什么问题啊!
liuweiqi 2010-07-28
  • 打赏
  • 举报
回复
这个内存消耗如果你没用到一些特殊的API的话 你只是调用他提供的函数,那问题肯定是出在他那边!
aikeli1234567 2010-07-28
  • 打赏
  • 举报
回复
问题没有解决,老板很生气,公司在烟台,急切寻找C#高手!!!!!
aikeli1234567 2010-07-22
  • 打赏
  • 举报
回复
有没有高手给解决一下?自己干着急
CGabriel 2010-07-22
  • 打赏
  • 举报
回复
谁申请的内存谁就要负责释放, dll 既然申请了内存,自然应该提供释放内存的方法。

ps: 对于 C++ 来说不存在这个问题
Carpathia 2010-07-22
  • 打赏
  • 举报
回复
你一下增长5M多,肯定是你的调用逻辑上出现的问题了,代码或者项目都发上来,否则我们帮补了你
zgke 2010-07-21
  • 打赏
  • 举报
回复
使用 Marshal.AllocHGlobal 申请空间 然后使用Marshal.FreeHGlobal 释放空间看看.

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧