Web服务器具有8 GB内存并托管多个站点。它们都具有相同的框架,并且应该在内存中占用200 - 350 MB。小t-sql更新后,站点内存使用量上升到1.9 GB。
起初我认为像谷歌机器人这样的多个抓取工具可以访问该网站并且很多内容都会被缓存。我为viewing cache创建了页面。在那之后,我发现默认情况下,站点的IIS内存是可用内存的50%,当达到99%时,它不是问题!
我对该Web应用程序进行了完整的内存转储,看看发生了什么:
似乎我有48012个DataTable实例(结构大小为512字节)。他们使用的数据是917 MB。
在回答之前,请先阅读“Should I Dispose() DataSet and DataTable?”,这是最佳答案。
有人可以解释发生了什么吗?
使用的大部分内存位于第2代。
第0代。这是最年轻的一代,包含短命 对象。短期对象的示例是临时变量。 垃圾收集在这一代中最常发生。新 分配的对象形成新一代的对象并且是隐式的 第0代集合,除非它们是大对象,在这种情况下 它们继续在第2代集合中的大对象堆上。最 在第0代和do中回收对象以进行垃圾收集 没有活到下一代。
第1代。这一代 包含短期对象并充当其间的缓冲区 短寿命物体和长寿命物体。
第2代。这个 生成包含长寿命对象。一个长寿的例子 object是服务器应用程序中包含静态数据的对象 这是在整个过程中一直存在的。
参考:link
在挖掘内存愚蠢之后,我发现大多数数据都是 trace 数据。然后我发现有人在web.conf中使用详细属性打开了Trace'ing。
<tracing>
<traceFailedRequests>
<add path="*">
<traceAreas>
<add provider="ASP" verbosity="Verbose" />
<add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
<add provider="ISAPI Extension" verbosity="Verbose" />
<add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,Rewrite" verbosity="Verbose" />
</traceAreas>
<failureDefinitions statusCodes="404" />
</add>
</traceFailedRequests>
</tracing>
通常跟踪数据可以在“* / trace.axd”页面中查看并包含~20个实例,但在我的情况下它被设置为4000.
答案 0 :(得分:1)
&#34; * / trace.axd&#34;上有一个链接我可以清除当前的痕迹。内存使用量降至600 MB。
<trace
enabled="true"
pageOutput="false"
requestLimit="4000"
localOnly="false" />
似乎很明显,问题是跟踪信息到了第2代堆。