Tag: garbage collection

HttpClientHandler / HttpClient内存泄漏

我有10到150个长生命类对象,可以调用使用HttpClient执行简单HTTPS API调用的方法。 PUT调用示例: using (HttpClientHandler handler = new HttpClientHandler()) { handler.UseCookies = true; handler.CookieContainer = _Cookies; using (HttpClient client = new HttpClient(handler, true)) { client.Timeout = new TimeSpan(0, 0, (int)(SettingsData.Values.ProxyTimeout * 1.5)); client.DefaultRequestHeaders.TryAddWithoutValidation(“User-Agent”, Statics.UserAgent); try { using (StringContent sData = new StringContent(data, Encoding.UTF8, contentType)) using (HttpResponseMessage response = await client.PutAsync(url, sData)) { using (var content […]

有趣的OutOfMemoryException与StringBuilder

我需要在循环中不断构建大字符串并将它们保存到数据库中,目前偶尔会产生OutOfMemoryException 。 这里基本上是基于一些数据使用XmlWriter和StringBuilder创建一个字符串。 然后我从外部库调用一个方法,将该xml字符串转换为其他字符串。 之后,转换后的字符串将保存到数据库中。 对于不同的数据,这整个过程在一个循环中重复完成约100次。 字符串本身不是太大(每个低于500kBy)并且在此循环期间进程内存不会增加。 但是,偶尔我会在StringBuilder.Append得到一个OutOfMemeoryExcpetion 。 有趣的是,此exception不会导致崩溃。 我可以捕获该exception并继续循环。 这里发生了什么? 尽管系统中仍有足够的可用内存,为什么我会得到一个OutOfMemoryException ? 这是一些GC堆问题吗? 鉴于我无法绕过转换所有这些字符串,我能做些什么来使这项工作可靠? 我应该强制GC收集吗? 应该将Thread.Sleep放入循环中吗? 我应该停止使用StringBuilder吗? 应该只是在面对OutOfMemoryException时重试?

什么是IDisposable?

如果.NET有垃圾收集,那你为什么要显式调用IDisposable ?

调试期间是否运行垃圾收集?

我有一个程序打开一个Excel COM对象,做一些东西,并关闭它。 然后我想在文件关闭后移动它。 如果我运行没有断点的程序,这可以正常工作。 但是,如果我在尝试移动文件之前进入调试模式,我会得到一个IOException:“进程无法访问该文件,因为它正被另一个进程使用。” 这是什么交易? 当一个程序被允许以全速运行而不是在我踩过它时,垃圾收集是否表现更好? 踩着我的代码做的不仅仅是非常缓慢地运行它吗? 调试模式还有其他后果吗? 遇到的其他错误只是因为我在调试而没有运行exe?