Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP应用程序:进程内存使用率与堆使用率_C#_Windows_Visual Studio_Win Universal App_Windows 10 Universal - Fatal编程技术网

C# UWP应用程序:进程内存使用率与堆使用率

C# UWP应用程序:进程内存使用率与堆使用率,c#,windows,visual-studio,win-universal-app,windows-10-universal,C#,Windows,Visual Studio,Win Universal App,Windows 10 Universal,我试图在VisualStudio中评测我的UWP(通用Windows平台)应用程序,看看是什么导致我的进程内存使用率如此之高 我一直在使用VisualStudio的内置诊断工具,但运气不好。 它显示了我的进程内存使用量为93MB,而堆显示为12.17MB,托管堆显示为1.56MB 还有一个例子,我的进程内存使用率高达458 MB,并且不断攀升,但当我拍摄快照时,它没有告诉我应该导致它的任何对象的值,而且它声称使用的实际内存比进程内存少得多 我不确定我是否只是不理解分析器是如何工作的,或者我只

我试图在VisualStudio中评测我的UWP(通用Windows平台)应用程序,看看是什么导致我的进程内存使用率如此之高

我一直在使用VisualStudio的内置诊断工具,但运气不好。 它显示了我的进程内存使用量为93MB,而堆显示为12.17MB,托管堆显示为1.56MB

还有一个例子,我的进程内存使用率高达458 MB,并且不断攀升,但当我拍摄快照时,它没有告诉我应该导致它的任何对象的值,而且它声称使用的实际内存比进程内存少得多


我不确定我是否只是不理解分析器是如何工作的,或者我只是做了一些完全错误的事情

简单的答案是——即使你的应用程序是用C#编写的——它仍然会分配大量的本机内存

通常,你在应用程序中加载的位图会占用大部分内存,因此我会开始研究减少内存中位图的数量和分辨率,并确保它们不会泄漏


第二,确保你的列表是虚拟化的。如果在内存中加载1000个图像,即使它们很小,也会占用大量内存。默认情况下-列表控件(如
ListBox
ListView
GridView
)是虚拟化的,除非您将它们放在
ScrollViewer
中,或将默认的
ItemsPanel
更改为未虚拟化的控件。

托管堆预先保留大量内存,而不实际使用它。您得到的托管堆的数字是已使用托管堆的数量。未使用的托管堆仍然会影响应用程序的内存使用。当用非托管语言编写代码时,数字就不会那么混乱了。@IInspectable这很有道理,但为什么它会分配比需要的内存多得多呢?还有一些情况下,我的进程内存使用量将在700 MB左右,而我的托管堆仍然只有50 MB左右MBs@IInspectable我刚刚添加了另一张图片和一些快照,试图解释我的问题。这就是CLR的托管堆的实现方式:它非常积极地使用内存,并且在托管堆上保留对象的时间通常比需要的时间长得多。一旦托管堆提交了保留内存,它将计入进程的私有字节。内存只有在Gen2 GC期间才是未提交的,而且因为这相当昂贵,所以它只有在内存压力较高时才会运行。有关托管堆的详细信息,请访问。是否有方法丢弃保留的对象?当我调用GC.Collect()时,这没有什么区别,我一定会研究这个问题。我注意到,仅仅是一个基本的应用程序,没有任何内容,它使用40兆,这并不坏,但也不是最好的。