序文:
.NETは常に「食欲が多すぎる」とメモリを消費することで批判されてきました。MicrosoftはGCは非常に機能的でインテリジェントであると主張していますが、メモリ回復の問題は、特にWinFormプログラムでは常に厄介です。主な理由は.NETだからです。プログラムは、起動時にJITによって動的にコンパイルおよびロードされる必要があります。このロードにより、必要なすべてのリソースがロードされ、多くのリソースは起動時にのみ使用されます。
XPシステムを例にとると、プログラムの起動後、タスクマネージャを開くと、占有されているメモリの量が比較的多いことがわかります。プログラムを最小化すると、プログラムが占有しているメモリが急速に減少することがわかります。小さな値に変更してからプログラムを復元すると、メモリ使用量が再び増加していることがわかりますが、開始したばかりのメモリ使用量の値よりもまだ小さいです。これはリソース最適化のプロセスです。このプロセスはアクティブです。オペレーティングシステムによって完了します。
システムメモリ使用量を削減するためのWinformの最適化スキーム:
1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中哪些代码占用内存较多
2、强制垃圾回收
3、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
4、发布的时候选择Release
5、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append
6、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect();
7、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。
8、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科
ガベージコレクションを実行するコードを定期的にクリーンアップします。
使用方法:ウィンドウプログラムでタイマーを使用し、ClearMemory()関数を呼び出して、数秒ごとにメモリを解放します。
#region 内存回收
[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary>
/// 释放内存
/// </summary>
public static void ClearMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
//FrmMian为我窗体的类名
FrmMian.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
#endregion
次の図は、ClearMemory()を使用する前後のメモリ消費量の比較チャートです。
転載:https://blog.csdn.net/qq15577969/article/details/89880538