在经典ASP内存泄漏中实现对象缓存

时间:2009-08-10 16:52:16

标签: optimization caching asp-classic memory-leaks

我尝试在传统的ASP网站中实现不同的缓存实现,以便在流量过大时卸载数据库。

我的方法是:

在global.asa中创建一个全局HashTable对象,稍后我将在 中存储jscript-objects

<object id="SIZE_LIST" progid="System.Collections.HashTable" runat="Server" scope="Application"></object>

这给了我一个全局HashTable对象,我在某个时间间隔替换了HashTable的内容。大小只会略有不同,但我每次都会.Remove()和.Add()所有对象。

这非常有效,除了在一定时间之后,应用程序的内存分配变得很高,会话的非理性行为。它将“忘记”会话,但不会在global.asa中调用OnSessionStart()。因此,为访问者留下一个空的会话集。

我可以以某种方式改进内存重新分配过程吗?是否有更好的对象缓存方法?

我尝试过使用带有json序列化数据的纯文本文件,但反序列化的开销很大。我想过二进制序列化,但我不确定它是否可能在经典的ASP中。

4 个答案:

答案 0 :(得分:1)

使用.NET HashTable而非常规“Scripting.Dictionary”的原因是什么?

当你做经典ASP时,为什么普通的COM对象不够用?

答案 1 :(得分:0)

不要试图重新发明轮子。使用memcache。它免费且易于设置。奖励是ttl(生存时间)并超出服务器边界

答案 2 :(得分:0)

这只是猜测,但可能是因为您将JScript对象存储到.net哈希中,您仍然可以保留对该对象的引用,因此垃圾收集永远不会有机会正常工作。

之前我曾经使用过带有JSON字符串的应用程序,在重新保湿数据的过程中快速实现了一种治疗和评估。

如果您担心数据过时,您可以使用XMLHTTPRequest服务器端(这令人惊讶地快速)来调用aspx页面,该页面将执行搜索并为您返回JSON字符串。 aspx页面可以通过.net的精彩缓存为您处理缓存,甚至可以使用SharpZipLib压缩JSON字符串,然后将其存储在缓存中以减少内存占用量。这也是在缓存中存储XML文件的一个很好的技巧(在0.0016秒内600K到25K!)

我们之前已经在项目中使用了以上所有内容,但并不完美,而是基于当时的限制和遗留代码的足够好的解决方案。而且它们都非常快(不是通过.net标准,而是为了快速编写脚本)。

答案 3 :(得分:0)

我会选择更低技术的方法,并在Application对象中单独存储每个对象(使用字符串键)。这样,您不仅可以从脚本引擎的角度看到一个巨大的对象。你认为这会有所帮助吗?