猿问

减少.NET应用程序的内存使用量?

有什么技巧可以减少.NET应用程序的内存使用?考虑以下简单的C#程序。


class Program

{

    static void Main(string[] args)

    {

        Console.ReadLine();

    }

}

在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:


Working Set:          9364k

Private Working Set:  2500k

Commit Size:         17480k

如果只为x86编译会更好一些:


Working Set:          5888k

Private Working Set:  1280k

Commit Size:          7012k

然后,我尝试了以下程序,该程序执行相同的操作,但尝试在运行时初始化后减小进程大小:


class Program

{

    static void Main(string[] args)

    {

        minimizeMemory();

        Console.ReadLine();

    }


    private static void minimizeMemory()

    {

        GC.Collect(GC.MaxGeneration);

        GC.WaitForPendingFinalizers();

        SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,

            (UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);

    }


    [DllImport("kernel32.dll")]

    [return: MarshalAs(UnmanagedType.Bool)]

    private static extern bool SetProcessWorkingSetSize(IntPtr process,

        UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);

}

在Visual Studio外部发布的x86 上的结果:


Working Set:          2300k

Private Working Set:   964k

Commit Size:          8408k

这样做更好一些,但是对于这样一个简单的程序来说似乎仍然过多。有什么技巧可以使C#流程更精简吗?我正在编写一个旨在大多数时候在后台运行的程序。我已经在单独的“ 应用程序域”中进行了任何用户界面操作,这意味着可以安全地卸载用户界面操作,但是仅在后台使用时要占用10 MB的空间。


PS关于我为什么要关心---(高级)用户倾向于担心这些事情。即使对性能几乎没有影响,精通半技术的用户(我的目标受众)也倾向于对后台应用程序的内存使用情况感到不满。甚至当我看到Adobe Updater占用11 MB的内存并因Foobar2000的平稳触摸而感到安慰时,即使我在播放时,它也占用不到6 MB的内存,我也感到非常惊讶。我知道在现代操作系统中,这些东西实际上在技术上并没有多大关系,但这并不意味着它对感知没有影响。


函数式编程
浏览 672回答 3
3回答

凤凰求蛊

与本地应用程序相比,.NET应用程序将具有更大的占用空间,因为它们都必须在运行时中加载运行时和应用程序。如果您想要真正整洁的东西,.NET可能不是最佳选择。但是,请记住,如果您的应用程序大部分时间处于睡眠状态,则必要的内存页面将被换出内存,因此在大多数情况下,实际上并不会给系统造成太大的负担。如果要减小占用空间,则必须考虑内存使用情况。这里有一些想法:减少对象的数量,并确保不要将任何实例保留的时间都超过所需的时间。请注意,List<T>类似类型的设备在需要时会使容量增加一倍,因为它们可能导致多达50%的浪费。您可以考虑使用值类型而不是引用类型,以在堆栈上强制使用更多内存,但是请记住,默认堆栈空间仅为1 MB。避免使用超过85000字节的对象,因为它们将进入未压缩的LOH,因此很容易碎片化。无论如何,这可能不是一个详尽的清单,而只是几个想法。

LEATH

在这种情况下,您需要考虑的一件事是CLR的内存成本。为每个.Net进程加载CLR,因此会考虑内存因素。对于这样的简单/小型程序,CLR的成本将决定您的内存占用量。与该基准程序的成本相比,构建一个实际的应用程序并查看其成本将更具启发性。
随时随地看视频慕课网APP
我要回答