我一直在调查在 IIS6 上运行的生产经典 ASP 网站的问题,这似乎表明存在内存碎片。
关于如何改善这一问题的建议之一来自 Stackoverflow:我如何才能找出为什么某些经典的 asp 页面随机需要很长时间才能执行?。它建议在网站的全局.asa文件“打开”低碎片堆(低频高频)。
以下代码(带有随附 DLL 的注册版本)可以达到此目的。
Set LFHObj=CreateObject("TURNONLFH.ObjTurnOnLFH")
LFHObj.TurnOnLFH()
application("TurnOnLFHResult")=CStr(LFHObj.TurnOnLFHResult)
(实际上,代码对于这个问题来说并不那么重要)。
链接帖子的作者报告了这个问题的一个看似神奇的解决方案,再读了一下之后,我发现这个设置在 Windows Server 2008 上默认启用。
因此,很自然地,这让我有点担心:
- 为什么 2003 上默认不启用此设置,或者
- 如果它在 2008 年有效,为什么微软没有发布补丁在 2003 年默认启用它?
我怀疑上述问题的答案对于两者来说都是相同的(如果有的话)。
显然,我们正在非生产环境中进行测试,并进行一系列指标和比较,以确定它是否对我们有帮助。但除此之外,我真的只是想了解我们这样做是否有任何技术原因,或者是否有任何我们需要注意的陷阱。
答案1
在 Windows 中,当编写不当的应用程序以低效的方式分配内存时,堆就会变得碎片化,从而导致其堆处于碎片状态。当应用程序的堆完全碎片化时,它就无法再进行内存分配,因为堆中没有一个连续的内存块足够大来满足请求。一切都是小碎片。即使所有这些小碎片的大小总和足以满足内存分配。
强调写得不好的申请。
Sysinternal 的 VMMap 适合查看进程的地址空间并检查是否存在此类碎片问题。
请注意,ASLR 也是在 2008 年引入的,这确实在一定程度上加剧了碎片化问题。我认为这与在该操作系统中默认启用 LFH 的决定有一定关系。此外,据我所知,LFH 策略往往需要更多的内存,这在 2003 年可能比在 2008 年更成问题。
要想得到更明确的答案,即为什么微软决定在 2008 年改变这一政策,你可能必须询问微软的工程师。