ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

【C#】内存优化

2022-09-13 10:31:44  阅读:240  来源: 互联网

标签:释放 调用 C# void 托管 内存 pBuffer 优化


一、内存占用大量资源的解决办法

1、定时清理

exe运行后占用内存一直增加导致软件越来越卡,调试发现是没调用一次某DLL函数就会增加一次,应该是内存泄露了,但就是没找到原因。

在主程序里加这段代码,定时清理内存,可暂时规避这一问题。

         #region 内存回收
         [DllImport("kernel32.dll")]
         private static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
         private static void FlushMemory()
         {
             GC.Collect();
             GC.WaitForPendingFinalizers();
             if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                 SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
         }
         #endregion
 
         // 定时销毁不用的内存
         private void timer1_Tick(object sender, EventArgs e)
         {
             FlushMemory();
         }

 

出处: http://t.zoukankan.com/orange1438-p-4544951.html

2、通过检查工具定位

https://blog.csdn.net/jianingshow/article/details/79096637

CLR Profiler工具使用:链接

 

二、调用C++的DLL 后释放内存

如果是stdcall调用,就是由dll释放
如果是cdecl调用,就是谁调用谁释放

要想成功释放非托管代码分配的内存,必须先确定非托管代码的内存分配方式,才能在互操作是选择正确的方法释放非托管内存,在非托管代码中,有3种分配方式:

1、C语言:malloc 、free
2、C++:new、delete
3、COM:CoTaskMenAlloc、CoTaskMenFree

第三种方式是互操作默认的释放非托管内存的方法!也就是说,采用前两种方式分配的非托管内存,托管代码不能正确释放,必须由非托管方自己明确释放:

C++:

wchar_t* GetStringNew()
{
    int iBufferSize = 128;
    wchar_t* pBuffer = new wchar_t[iBufferSize ];
    if(NULL != pBuffer)
    {
        wcscpy_s(pBuffer, iBufferSize/sizeof(wchar_t), L"String from New");
    }
    return pBuffer;
}

   void FreeNewMemory(void* pBuffer)
        {
            printf("\n%d", pBuffer);
            if (NULL != pBuffer)
            {
                delete pBuffer;
                pBuffer = NULL;
            }
        }

 

C#:

[DllImport("NativeLib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode )]
static extern string GetStringNew();
 [DllImport("NativeLib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode )]
static extern void FreeNewMemory(IntPtr pbuffer);

IntPtr strPtr=GetStringNew();
string str=Marshal.PtrToStringUni(strPtr);
FreeNewMemory(strPtr); //显示调用非托管释放内存函数释放内存,否则内存会泄露

 

出处:http://www.aiyiweb.com/Csharp/25018

 

标签:释放,调用,C#,void,托管,内存,pBuffer,优化
来源: https://www.cnblogs.com/Mars-0603/p/16688333.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有