例如,如果向服务器发出3个请求,是否意味着将3个Web应用程序实例放入内存?
如果您使用锁定的单例或缓存了一个类,那么每次检查对象是否存在时都会创建该对象(如果该对象不存在),这是否表示该对象是针对每个请求缓存的?或者它是否缓存一次并重复用于每个请求?
如果我锁定单例,这是否意味着使用单例的对象创建一次并且每个请求使用相同的对象?或者它是否意味着对象是为每个请求使用单例创建的,但是不是由同一个线程再次创建的?
如果我使用 System.Web.HttpRuntime.Cache["key"];
缓存一个1 MB的对象并发出了10个请求,那么我在服务器上使用了10 MB的内存吗?如果我使用单例创建一个新对象...在线程和内存分配方面会发生什么?
2 回答
你的实例 - 进程和你的3个请求 - 由线程执行 . 因此,单个对象将在所有3个请求之间共享 . 您的缓存也将在请求之间共享 . 在您的示例中,您将仅分配1 Mb(它将更新10次) . 垃圾收集器将收集未使用的空间 .
在IIS中,为每个应用程序创建一个AppDomain,并与同一AppPool中的其他应用程序共享一个进程 .
因此,对同一Web应用程序内的服务器的3个请求将共享相同的AppDomain .
这会如何影响缓存和单身:
来自System.Web.Caching.Cache上的文档:
锁定对象(如单例)时,锁的范围也是AppDomain .