【问题标题】:Understanding threading in asp.net and how server memory is allocated了解 asp.net 中的线程以及如何分配服务器内存
【发布时间】:2012-11-28 10:15:28
【问题描述】:

例如,如果向服务器发出 3 个请求,这是否意味着将 3 个 Web 应用程序实例放入内存?

如果你使用了一个锁定的单例或者缓存了一个类,所以每次它检查对象是否存在并且如果它不存在就创建对象,这是否意味着每个请求都缓存了对象?还是缓存一次并为每个请求重用?

如果我锁定了一个单例,这是否意味着使用单例的对象被创建一次并且每个请求都使用相同的对象?或者这是否意味着该对象是为每个请求使用单例创建的,但不是由同一个线程再次创建的?

如果我使用System.Web.HttpRuntime.Cache["key"]; 缓存一个 1 mb 的对象并发出 10 个请求,我是否在服务器上使用了 10 mb 的内存?如果我使用单例创建了一个新对象...在线程和内存分配方面会发生什么?

【问题讨论】:

    标签: c# asp.net multithreading caching memory


    【解决方案1】:

    在 IIS 中,为每个应用程序创建一个 AppDomain,并将与同一 AppPool 中的其他应用程序共享一个进程。

    因此,同一个 Web 应用程序中对服务器的 3 个请求将共享同一个 AppDomain。

    这如何影响缓存和单例:

    来自System.Web.Caching.Cache 上的文档:

    每个应用程序域都会创建一个此类的实例,只要应用程序域保持活动状态,它就会保持有效。

    当您锁定一个对象(如单例)时,锁定的范围也是 AppDomain。

    【讨论】:

    • 那么 AppDomain 是什么时候创建的呢?当用户提出请求时?
    • 当我说锁定单例时,我的意思是当它像这样实现时: public static T GetInstance() { lock (typeof(T)) { if (instance == null) { instance = new T( ); } 返回实例; } }
    • 应用程序池重启后的第一次请求。并注意静态属性或单例。在多服务器环境(webfarm)中,静态对象或单例的数量与您拥有的节点数量一样多。
    • @user1809104 是的,第一个请求将导致创建 AppDomain。此外,关闭或重新启动 AppPool(可能会在一段时间不活动后自动发生)将重新开始该过程。
    • @user1809104 我已编辑我的帖子以回答lock 问题
    【解决方案2】:

    您的实例 - 进程和您的 3 个请求 - 由线程执行。所以单例对象将在所有 3 个请求之间共享。您的缓存也将在请求之间共享。在您的示例中,您将仅分配 1 Mb(它将更新 10 次)。垃圾收集器将收集未使用的空间。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多