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

Session 经典ASP的IIS6中的会话状态和垃圾收集,session,asp-classic,iis-6,garbage-collection,Session,Asp Classic,Iis 6,Garbage Collection,这是一个有点老掉牙的问题,可能是相对基本的,但我不知所措 IIS如何管理经典ASP会话状态 我们有一个在会话中存储用户信息的应用程序,当许多用户使用该应用程序时,它似乎是在为用户回收会话,即使“过期期”还没有过去 我们怀疑,当会话状态使用了一定数量的内存时,它开始循环使用最旧的会话对象或类似的东西 如果这是正确的,是否有一些方法可以用现有的应用程序代码来控制它 谢谢 当承载ASP应用程序的进程终止时,ASP会话将作为简单的内存COM对象存储,所有会话也将如此 ASP不会“回收”活动会话。但是,还

这是一个有点老掉牙的问题,可能是相对基本的,但我不知所措

IIS如何管理经典ASP会话状态

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

我们怀疑,当会话状态使用了一定数量的内存时,它开始循环使用最旧的会话对象或类似的东西

如果这是正确的,是否有一些方法可以用现有的应用程序代码来控制它


谢谢

当承载ASP应用程序的进程终止时,ASP会话将作为简单的内存COM对象存储,所有会话也将如此

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

应用程序池空闲超时

“会话”出现提前超时的一个幻象原因是,所讨论的“会话”在开发过程中正在测试中。因此,当开发人员检查页面内容或查看某些代码时,不会有进一步的请求访问该站点,因为它实际上不是一个活动站点

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

应用程序池回收

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

可以配置大量不同的设置和条件来触发应用程序池的回收。查看“池属性”对话框的“回收”选项卡

如果您认为内存需求过大,则内存回收部分可能会指出原因

网络花园

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

会话。放弃或会话。清除


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

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

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

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


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

快速澄清:当您讨论应用程序池空闲超时时-我假设这意味着整个应用程序池处于空闲状态(即零请求),或者当特定用户的会话在空闲超时期间处于空闲状态时也会发生吗?它指的是整个池,您的应用程序可能完全处于空闲状态,但若该池还托管其他处于活动状态的应用程序,则不会超时。应用程序池中加载的所有内容都必须完全空闲,以便空闲超时生效。