ASP.NET(C#)写了一个采集类 GetItem ,采用静态方法采集网页信息然后入库,另有两个Web窗体Default.aspx和Caiji.aspx,现在Default.aspx.cs保持默认(空白网页),在Caiji.aspx.cs中调用采集类如下:
 protected void Page_Load ( object sender , EventArgs e )
        {
            GetItem.Caiji ( ); //采集信息并入库
            GC.Collect ( ); //启动垃圾收集器
        }
现在情况是这样的:
IIS启动后在任务管理器显示aspnet_wp.exe进程内存使用为3,432K;
将程序发布到本地IIS然后打开空白网页Default.aspx任务管理器显示aspnet_wp.exe进程内存使用为23,472K;
后打开采集网页Caiji.aspx任务管理器显示aspnet_wp.exe进程内存使用为108,245K;
刷新Caiji.aspx 显示 aspnet_wp.exe进程内存使用为109,342K;
刷新Caiji.aspx 显示 aspnet_wp.exe进程内存使用为110,022K;
刷新Caiji.aspx 显示 aspnet_wp.exe进程内存使用为108,682K;………………多次刷新该网页后 aspnet_wp.exe进程内存使用一直在108,000K -- 112,000K之间。关闭所有打开的网页后aspnet_wp.exe进程内存使用不见降低仍然保持在108M以上。现在我有一些问题非常困惑:
1、我想实现关闭网页后内存占用降低至打开空白网页状态是(大概23M左右),这样有可能吗,该如何实现?
2、GC.Collect ( )垃圾收集器调用好像没有多大作用,是不是调用时机(位置)不对。应该怎样调用?

解决方案 »

  1.   


    try
                    {
                        GC.Collect();
                        GC.SuppressFinalize(this);                    if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                        {
                            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                        }
                    }
                    catch { }
          [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
        System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
            private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
    用这个去定时释放资源。
      

  2.   

    头几天我也在研究asp.net占用内存过高的问题。后来查资料发现,asp.net在第一次运行的时候,会把大量资源加载到内存。其中还保护了CLR的底层一些类库,所以可以采用第一次加载调用内核函数来释放一些内存。这样在之后的运行系统会再加载用到的类而不是全部类!
      

  3.   

    他写的这个代码是调用系统内核来实现内存的释放,在winform程序中可用。但是在web程序中可能不可用,因为web程序运行账户可能没有调用系统内核函数的权限。系统管理第一次加载的时候当然是page_load事件了。