【问题标题】:What happens when session keys are assigned and removed?分配和删除会话密钥时会发生什么?
【发布时间】:2015-11-22 14:48:39
【问题描述】:

我正在使用会话变量来存储对象,方法是将它们分配给相应的会话键。因为这些变量是特定于会话的,所以垃圾收集器不会收集它们,而是会被会话超时清除。为了删除这些会话变量,我必须删除包含我不想再使用的对象的键。

将对象分配给会话变量时,该会话键是指向对象引用本身还是创建另一个引用?

当使用 .Remove() 删除包含对象的会话密钥时,此删除是否会清除该内存空间,还是它仍然存在于后台但没有相关密钥?

我问这个是因为我想知道使用多个会话变量(例如会话中的大对象和许多用户)时服务器性能是否受到影响,以了解是否删除不会使用的对象的键不再会在服务器内存使用方面带来好处,并且还可以了解当这些键被删除时会发生什么。

【问题讨论】:

    标签: c# asp.net vb.net iis garbage-collection


    【解决方案1】:

    根据我的基本理解 - 当您将变量分配给会话键时,它将存储其指针(当它是引用类型时)或装箱(当它是值类型时,因为您在会话中存储一般对象) ,因此创建它的副本。

    当使用 .Remove() 删除包含对象的会话密钥时,此删除是否会清除该内存空间,还是它仍然存在于后台但没有相关密钥?

    这取决于引用是否被认为是垃圾。如果没有指向存储的引用,它将使用最近的 GC 将其删除。

    我问这个是因为我想知道在使用多个会话变量(例如会话中的大对象和许多用户)时服务器性能是否受到影响,以了解是否删除不会使用的对象的键不再会在服务器内存使用方面带来好处,并且还可以了解当这些键被删除时会发生什么。

    您不应该在会话中存储大对象,因为它总是会影响性能。大对象总体上是有问题的(通常会被移动到下一代 GC,这将导致它们的生命周期延长 - 占用应用程序内存的时间会更长,可能会导致内存碎片导致垃圾收集持续更长时间)。

    由于Session 在内部使用索引器并且其项目存储为Hashtable,您可以认为Session 是某种特定于请求的数组。考虑到由于它与每个请求一起传递并且必须存储在某个地方,因此您添加到其中的许多对象将持续存在,例如用户处于活动状态。如果您有成千上万的用户并存储例如每个 1MB,想象一下应用程序生命周期将分配多少内存。

    【讨论】:

    • 因此,例如,如果我将一个对象分配给一个名为“BigObject”的 Session 变量,并且该变量是对该对象的唯一引用,一旦删除该键,它将被 GC 收集.对吗?
    • @jecarfor 没错。由于变量和会话项都只是指针,本身并不代表真正的值,一旦没有其他对该对象的引用,GC就会认为它是垃圾并删除它。
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多