摘要:Session,Session,Session!(请耐心阅读………………)
地球人都知道,asp.net中有三种方式存放我们的session objects。In Proc模式,在cache中存放对象。StateServer在State Service中存放,最后一种是存放在SQL Server中。对于In Proc模式,太多的session对象,意味着高内存占用;对于后两者,意味着序列化和反序列化的性能损失。Session存放的东西太多,不一定意味着性能的问题,但这依赖于你往session里面存放的东西。让我们假设一个场景,你开发了一个网上商店,有很少的人在用,所以你只用了一台web server,使用了In Proc模式,你的程序对每个用户的订单,都存放了一些dataset。突然,你的程序出名了!一个大公司来找你,于是,你增加了N台web server,同时把Session State也修改成了SQL Server模式。
问题来了!asp.net进程,内存占用很好(800MB – 1GB),有时候会提示OutOfMemory异常,或者提示.net进程被recycled了。dump的大小为1,473,913 bytes,所以,大概就是1.4G。首先,我们看看托管堆上面都有些啥东西?
0:023> !eeheap -gcNumber of GC Heaps: 2------------------------------Heap 0 (0x000b7198)generation 0 starts at 0x022104d4generation 1 starts at 0x022037c0generation 2 starts at 0x02170030ephemeral segment allocation context: none segment begin allocated size0x2170000 0x2170030 0x224a4e0 0xda4b0(894,128)Large object heap starts at 0x0a170030 segment begin allocated size0x0a170000 0x0a170030 0x0acf0b20 0x00b80af0(12,061,424)0x0d490000 0x0d490030 0x0e3d2450 0x00f42420(16,000,032)0x12010000 0x12010030 0x12f52460 0x00f42430(16,000,048)0x13010000 0x13010030 0x13f52460 0x00f42430(16,000,048)0x15010000 0x15010030 0x15f52460 0x00f42430(16,000,048)0x1a010000 0x1a010030 0x1af52460 0x00f42430(16,000,048)…0x71ca0000 0x71ca0030 0x72be2470 0x00f42440(16,000,064)0x748b0000 0x748b0030 0x757f2470 0x00f42440(16,000,064)0x7d0e0000 0x7d0e0030 0x7d881250 0x007a1220(8,000,032)Heap Size 0x2d5b4e10(760,958,480)------------------------------Heap 1 (0x000ede88)generation 0 starts at 0x06249b58generation 1 starts at 0x0623e190generation 2 starts at 0x06170030ephemeral segment allocation context: none segment begin ......[
阅读全文]