在我的主机公司,我有2个或多或少相同的.net应用程序。这两个应用程序使用相同的池,其最大内存为300 MB。
我可以刷新其中一个应用程序的起始页大约10次,然后我得到一个内存不足异常并且池崩溃了。
在我的应用程序中,我打印出这些内存值:
PrivateMemorySize64:197 804.00 kb(193.00 mb)
PeakPagedMemorySize64:247 220.00 kb(241.00 mb)
VirtualMemorySize64:27 327 128.00 kb(26 686.00 mb)
PagedMemorySize64:197 804.00 kb(193.00 mb)
PagedSystemMemorySize64:415.00 kb(0.00 mb)
PeakWorkingSet64:109 196.00 kb(106.00 mb)
WorkingSet64:61 196.00 kb(59.00 mb)
GC.GetTotalMemory(true):2 960.00 kb(2.00 mb)
GC.GetTotalMemory(false):2 968.00 kb(2.00 mb)
我已阅读,阅读和阅读有关内存分析的视频,但在对应用程序进行概要分析时,我无法发现任何问题。 我使用ANTS内存分析器8并在构建后刷新初始化一次时获得此结果: a http://oi60.tinypic.com/21l057c.jpg
当我查看摘要时,.NET正在使用为应用程序分配的41.65 MB的135.8 MB总私有字节。 每次刷新时,此值越来越大。这是正常的吗?当我刷新8次时,我得到这个: .NET正在使用为应用程序分配的56.11 MB的153 MB总私有字节。
我应该从哪里开始?使用这么多内存会有什么问题?内存是300 MB到低吗?
答案 0 :(得分:1)
这无疑是由于代码中的内存泄漏,可能是因为没有处理/关闭与队列或数据库之类的连接。除了剖析,检查您的代码并确保您关闭/处置所有适当的资源:您的问题应该自行缓解。
答案 1 :(得分:0)
有一些数据库连接尚未处理。然后我有一个删除Etags的类,如下所示:
public class CustomHeaderModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
void OnPreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove("ETag");
}
}'
我必须删除我在Init功能中添加的新事件吗?或者GC会修复吗?
我有很多这个:
Task.Factory.StartNew(() =>
{
Add(...);
});
但我不会将它们丢弃在我的代码中。 GC是否会以其他方式解决这个问题或应该做什么?