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

Optimization 在经典ASP内存泄漏中实现对象缓存,optimization,caching,asp-classic,memory-leaks,Optimization,Caching,Asp Classic,Memory Leaks,我曾尝试在一个经典的ASP站点中实现不同的缓存实现,以便在流量过大时卸载数据库 我的做法是: 在global.asa中创建一个全局哈希表对象,稍后我将在其中存储jscript对象 这给了我一个全局哈希表对象,我在特定的时间间隔替换哈希表的内容。大小只会略有不同,但每次都会.Remove()和.Add()所有对象 这非常有效,除了在一段时间后,应用程序的memoryallocation会变得很高,导致会话的非理性行为。它将“忘记”会话,但不会调用global.asa中的OnSessionSta

我曾尝试在一个经典的ASP站点中实现不同的缓存实现,以便在流量过大时卸载数据库

我的做法是:

在global.asa中创建一个全局哈希表对象,稍后我将在其中存储jscript对象


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

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

我能改进内存重新分配过程吗?有没有更好的对象缓存方法


我曾尝试将纯文本文件与json序列化数据一起使用,但反序列化的开销太大。我考虑过二进制序列化,但我不确定它在经典ASP中是否可行

在常规“Scripting.Dictionary”上使用.NET哈希表的原因是什么


当您使用经典ASP时,为什么普通COM对象还不够?

不要尝试重新发明轮子。使用memcache。它是免费的,易于安装。另外一个好处是,它有ttl(生存时间)并且可以在服务器边界之外工作,这只是一个猜测,但可能是因为您将JScript对象存储到.net哈希中,所以您仍然可以保留对该对象的引用,这样垃圾收集就永远没有机会正常工作

我以前使用过JSON字符串的应用程序,它可以快速处理和评估数据

如果您担心数据过时,可以使用XMLHTTPRequest服务器端(速度惊人)调用aspx页面,该页面将执行搜索并为您返回JSON字符串。aspx页面可以使用.net出色的缓存为您处理缓存,甚至可以在将JSON字符串存储在缓存中之前使用SharpZipLib压缩JSON字符串,以进一步减少内存足迹。这也是将XML文件存储在缓存中的一个很好的技巧(在0.0016秒内从600K降至25K!)


我们以前在项目中使用过上述所有方法,虽然不完美,但基于当时的局限性和遗留代码,这是一个足够好的解决方案。而且它们都非常快(不是用.net标准,而是用脚本编写的非常快)。

我会选择一种技术含量较低的方法,将每个对象分别存储在应用程序对象中(使用字符串键)。这样,从脚本引擎的角度来看,您就不会只有一个巨大的对象。你认为这会有帮助吗?

afaik Scripting.Dictionary和IISSample.LookupTable都绑定到一个事实,即它们只能存储基本数据类型(字符串和数字)。这将使我再次需要序列化。当然,我不需要反序列化所有内容。LookupTable也不支持动态更改(我知道我们在脚本编写.Dictionary方面遇到了问题,但我不能肯定),我想这就是问题所在:脚本编写。Dictionary可以存储您喜欢的任何值。对象引用和基元值。唯一的限制:键必须是字符串。还要注意,链接的MS KB文章“Scripting.Dictionary对象在ASP应用程序范围内失败”对您完全不适用。我可以将其存储在应用程序中吗?我来看看。据我所知,memcached至少需要2台单独的服务器。对于这样一个简单的任务来说,这是一个相当大的设置。它也是基于网络的,这意味着比存储在RAM中的开销更大。当然,正如你所说,更具可扩展性,如果我创建一个安装程序,我可以将其用于多个站点,但我不确定在不久的将来,甚至从长远来看,我是否有这种需要。memcache可以在同一台机器上运行。你说得对,有点开销。但与不必每次都进行查询相比,它的好处很小。我们在应用程序中存储json字符串时也遇到了同样的内存问题。尽管评估速度非常快,但CPU上的评估也非常激烈。我们在SessionStart事件中也遇到了这种奇怪的行为。在这种情况下,这一切都取决于我们在应用程序中存储的数据量,所以它看起来不是防弹的,或者我们做错了什么。当w3wp.exe开始使用大约300MB时,我们开始发现一些访问者会遇到这种间歇性问题。如果只是偶尔出现一个峰值,那么CPU的密集度是可以的,不是这样,那么是的,您做了太多的工作,您将不得不重新访问此解决方案。可能是您试图对缓存做的太多了。你真的需要缓存所有东西吗?如果您这样做了,那么您可能不得不采用构建自定义函数的方法,从应用程序中重建对象,而不是对其求值(请参阅)。我知道你们说过你们不想这么做,但你们的选择是有限的,现在尝试一下吧,搞乱应用程序并不是一个好主意。不断地从应用程序中写入/读取数据往往会耗尽所有内存,并导致会话破坏。
<object id="SIZE_LIST" progid="System.Collections.HashTable" runat="Server" scope="Application"></object>