我有一个ASP.NET MVC Web应用程序,它在自己的应用程序池(.NET 4.7.1应用程序,64位,IIS 10)上运行,服务器(Windows Server 2016)上有大量可用内存。在我启动应用程序并加载第一个网页之后,我查看了任务管理器,并使用相当多的内存查看了w3wp.exe进程:
我认为考虑到它只是一个网络应用程序,这有点太多了。所以我启动了dotMemory并附加到该进程。我得到了那些结果:
在这里,它说使用的总量是1.1 GB(不仅仅是853 MB),非托管内存是429.5 MB,其余是堆。
当我得到快照时(如屏幕截图所示),它总共显示1.08 GB,其中.NET为75.06 MB(其余部分未受管理)。 这些数字似乎没有加起来。一个说429.5非托管内存,另一个显示像1 GB的非托管内存。这是否意味着堆被视为快照中的非托管内存?
所有dotMemory让我看看63.73 MB的.NET使用内存,在那里我可以看到我有多少类型的对象。
我很想知道其余的是什么。 我无法窥视其他千兆字节内存中的内容? GC尚未发布的内容是什么?如果是,为什么不在dotMemory中运行“Force GC”会显着减少它?
此外,所有非托管内存都来自哪里?我在网上找到的只是如果没有正确释放某些位图或P / Invoke内容,通常会发生非托管内存泄漏。但是我的应用程序池从一开始就具有这种用法(因此它不会随着时间的推移而累积泄漏),并且它既不处理位图或图像,也不处理本机DLL或使用第三方库。另一种选择可能是它的ASP.NET缓存,但它只使用很少,而且我认为在单页加载后它不会有400 MB。
我曾经观察过IIS应用程序池如果有大量可用内存可能会非常贪婪,但这似乎相当过分 - 1 GB vs 60 MB。我不明白那里发生了什么。
我认为没有内存泄漏,因为我可以让应用程序池运行数周,并且内存不会显着增加。只是当我认为它不应该使用那么多时,它会占用大量的内存。
你能帮我找一些学习资源或工具来帮助我调查这个问题吗?
答案 0 :(得分:1)
Gen 0堆大小显示可以分配的最大字节数 第0代;它不表示当前的字节数 在第0代分配。 http://msdn.microsoft.com/en-us/library/x2tyfybc(v=vs.110).aspx
请查看此答案以获取更多详细信息。 TL; DR - ASP由于某种原因为第0代创建了巨大的堆。