asp.net – .NET中的大型Gen 0堆,浪费内存?
我有一个使用大量内存的ASP.NET / C#Web应用程序.
ANTS Memory Profiler和PerfMon都显示我的Gen 0堆在Application_Start期间迅速增长到大约1 GB.我读到here,Gen 0 Heap的PerfMon计数器实际上显示了Gen 0的“预算”,而不是大小(我认为并非所有内存都是进程的私有工作集的一部分?).然而,ANTS分析器确实显示了大约700 MB的“未使用的内存分配给.NET”,这似乎是该过程的私有工作集的一部分(如taskmgr中所报告的).我猜这个大量未使用的内存与大的Gen 0堆有关. 在发生这种情况时,Application_Start中发生的事情是我在一个while循环中读取来自SqlDataReader的大约一百万行.这些用于填充大型缓存以供以后使用.鉴于此,大量未使用内存的明显罪魁祸首是大对象堆碎片,但我不认为是这种情况,因为我预先分配的数量超过了我的大型缓存对象所需的数量.可以肯定的是,我甚至尝试将实际添加到缓存对象的循环部分注释掉;它没有分配未使用的内存量. 作为测试,我经常尝试在循环期间强制收集gen 0的垃圾回收(针对所有建议,我知道),这导致gen0堆的大小保持在128 MB左右并且还导致仅几MB未使用免费记忆.但它也最大化了我的CPU并使Application_Start占用太长时间. 我的问题是: 1)什么可以导致Gen 0堆的报告大小增长如此之大? 2)这是一个问题吗?特别是,它是否会导致大量未使用的空间被分配给.NET? 3)如果是这样,我该怎么做才能修复它?如果我无法阻止进程在Application_Start期间使用那么多内存,我想至少能够在应用程序启动完成时让它放弃内存. 解决方法
Gen 0包含“最年轻,最近分配的对象”,并且与LOH分开且不同.它听起来像是你分配吨和吨的小对象(与那些缓存条目相关的所有勘误表,根据它的声音),它们是无根的(由频繁的GC保持尺寸下降证明)但没有清理及时,因为GC还没有认为有必要. GC还没有看到清理的必要性.机器有多少RAM?我猜你不是在寻呼.
我的理解是,当GC认为不再需要时,.NET可以将未使用堆的块返回给操作系统(例如,因为堆空间已经很长时间没用过了).您是否在很长一段时间内观察了应用程序,看看是否会发生这种情况?如果你不是分页,我不认为这是一个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在ASP.NET中动态生成列表项到无序列表?
- asp.net-web-api2 – ASP.NET 5(vNext)/ Web API / OAuth /
- 剃刀 – Telerik Kendo MVC TextBox多线模式
- asp.net – 不包括’00000’的5位数字的正则表达式
- ASP.NET数据绑定技术
- asp.net-mvc – DateTime字段和Html.TextBoxFor()帮助器 如
- entity-framework – 未运行SetInitializer但EF仍在尝试Cre
- asp.net-mvc-4 – LinkedIn在MVC4中使用DotNetOpenAuth的完
- asp.net-mvc – IdentityDbContext vs Reb的DbContext
- 404的ASP.NET自定义错误页面为http状态返回302
- asp.net – MathJax – 文件无法加载:/extensio
- asp.net – 无法从代码背后更改CssClass
- asp.net core 日志
- asp.net-mvc-3 – 无法解析属性:User.Full_Name
- asp.net – 在Entity Framework中的2个语句中锁定
- asp.net – Web.Config中的Assemblies节点的目的
- asp.net web-api – ASP.net Web API RESTful We
- 在asp.net中引用jquery的最佳方法是什么?
- jQuery validate 根据 asp.net MVC的验证提取简单
- asp.net-mvc – MVC ajax json post到控制器动作