理解.NET内存管理和分析。

问题描述 投票:0回答:1

我有一个C#应用程序,它消耗的内存量绝对不足,而且还在稳步增加。我试着使用Visual Studio 2019内存剖析器来查找问题。我期待看到一些特定类型的千兆字节的对象,并找到泄漏,但相反,我发现一个完全正常的对象集,每个类型不超过800 KB。

Heap snapshot

快照大小也显示正常的堆大小为8MB,而进程内存接近5GB!

Profile screenshot

我的想法是GC出于某种原因拒绝收集未引用的对象,但GC的标记确实经常出现在内存图表上。我也试过通过调用GC.Collect()来清理gen 2对象。

看来我不明白内存处理的一些基本概念。我错过了什么?我该怎么做才能找到问题所在?

UPD:我还发现了一个奇怪的问题。我在我的软件中使用了一个FluentFtp客户端,当我在堆中发现这些条目时(我没有使用任何其他的网络功能)。

FluentFtp

我以为我已经找到了漏洞。这些数字从来没有减少过,即使处理掉一个线程也无济于事!但是当我把ftp代码提取到独立的应用程序中,问题就消失了。

FtpClient client = new FtpClient(<ip>);
client.Credentials = ...
for (int i = 0; i < 1000; i++)
{
   client.Connect();
   client.Disconnect();
}

最后,我只有63个这样的对象! 请注意,私有内存只是比堆大86倍,而不是我的应用程序中的625倍.为什么完全相同的代码在我的应用程序中产生不同的结果?

FluentFtpProfiling

FluentFtp heap

c# .net memory-management profiling
1个回答
0
投票

看来确实是FluentFtp的问题。我把它换成了另一个库,一切都恢复了正常。但我还是不明白为什么我不能在单独的应用程序中重现这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.