IIS6中经典ASP的会话状态和垃圾回收

时间:2009-09-15 18:22:24

标签: session asp-classic iis-6 garbage-collection

这是一个回归问题,可能相对基础,但我不知所措。

IIS如何管理Classic ASP会话状态?

我们有一个应用程序在会话中存储用户信息,当许多用户使用该应用程序时,它似乎是用户的回收会话,即使“过期时间”尚未过去。

我们怀疑当会话状态使用了一定量的内存时,它会开始回收最早的会话对象或类似内容。

如果这是正确的,有没有办法用现有的应用程序代码来控制它?

谢谢!

3 个答案:

答案 0 :(得分:4)

当托管ASP应用程序的进程终止时,ASP会话将作为简单存储在内存COM对象中,因此所有会话都将被存储。

ASP不会“回收”活动会话。但是,还有许多其他情况会影响ASP会话。

应用程序池空闲超时

“会话”似乎过早超时的一个幻象原因是因为所讨论的“会话”在开发期间刚刚进行测试。因此,虽然开发人员正在检查页面内容或查看某些代码,但由于其实际上并非实时站点,因此没有其他请求进入该站点。

在IIS管理器中,打开运行ASP应用程序的池的属性。看一下Performance选项卡。空闲超时默认为20分钟。因此,如果您指定了60分钟的会话超时并且您正在“测试”该超时,那么您实际上发现您的会话已在20分钟内超时。缺乏活动已经杀死了应用程序池。

应用程序池回收

IIS可以回收运行ASP应用程序的应用程序池。回收意味着当前托管ASP应用程序的现有进程集不再接受新请求。新请求转到一组新流程,旧流程将在完成未完成请求后终止。

可以配置一系列不同的设置和标准来触发应用程序池的回收。查看池属性对话框的“回收”选项卡。

如果您认为可能存在对内存的过度需求,则内存回收部分可能会指出原因。

Web Garden

应用程序池可以包含多个进程来运行同一组应用程序。返回性能选项卡,注意底部的Web Garden部分。默认情况下,此值设置为1.但是,多个工作进程将对ASP会话造成严重破坏。如上所述,ASP会话是简单的内存中COM对象。如果特定会话的后续请求被抛弃给不同的工作者,则一个工作者将无法访问另一个工作者的会话对象。

Session.Abandon或Session.Clear

逻辑错误有时可能是会话显然消失的原因。在会话生活中不适当的地方调用上述方法可能会导致问题。

答案 1 :(得分:0)

我经历过同样的事情。会话似乎清空了数据,这意味着没有变量不再存储在会话中,但由于会话存在,On_SessionStart不会触发。

如果您为以后依赖的访问者初始化数据,那么会让您头疼......

我认为这是一个似乎没有人知道的错误,并且没有找到解决方案。正如您所指出的,它似乎与内存使用有关,而解决方案似乎是确保您没有任何泄漏。

Implement object-caching in classic ASP memory-leaking

答案 2 :(得分:0)

对我来说,这个问题原来是“性能”选项卡下的工作进程数。由于某种原因,它被设置为2。我们将其设置为1,问题就消失了。