在管理一段代码时,越来越清楚的是它导致它所托管的应用程序池越来越多地消耗内存。我们能够通过设置自动重置间隔来恢复内存消耗,或者通过为进程设置内存上限来解决这个问题,然后重置,但在任何一种情况下,我们都会遇到意外丢失会话变量和当时正在运行的任何进程的中断。
在预感中,我们编写了一个测试应用程序来测试会话变量可能在这个内存消耗背后的理论,并发现即使在具有单个(大)Session变量的简单应用程序中,我们也能够复制问题。下面是我们在Page_Load事件中添加的代码:
DataTable table = new DataTable();
table.Columns.Add("GUID", typeof(string));
table.Columns.Add("Value", typeof(int));
for (int i = 0; i < 1000; i++)
{
table.Rows.Add(System.Guid.NewGuid(), i);
}
Session["Table"] = table;
每次重新加载时,消耗的内存量都会增加。无论我们等待多长时间,内存消耗都不会降低,因此Session变量似乎没有被正确地垃圾收集。
我们尝试通过以下方式清除Session变量来启动加载:
Session["Table"] = null
或
DataTable tableFree = Session["Table"] as DataTable;
tableFree = null;
Session["Table"] = null;
并发现在这两种情况下,这些变化似乎没有什么区别(可能是因为它已保存到的会话已经结束了?)。有没有人知道在会话变量中存储对象或随后的垃圾收集存在任何问题?