当会话密钥被分配和删除时会发生什么?

4
我使用会话变量将对象分配给相应的会话键来存储对象。由于这些变量是特定于会话的,因此它们不会被垃圾回收器收集,而是在会话超时时清除。为了删除这些会话变量,我必须删除保存不再需要的对象的键。
当将对象分配给会话变量时,该会话键指向对象本身还是创建另一个引用?
当使用.Remove()方法删除保存对象的会话键时,是否清除该内存空间,还是仍然存在但没有相关的键?
我问这个问题是因为我想知道当使用多个会话变量(例如会话中的大对象和多个用户)时是否会影响服务器性能,以及知道删除不再使用的对象的键是否有益于服务器内存使用,还要了解在删除这些键时发生了什么。
1个回答

2
根据我的基本理解,当您将变量分配给会话密钥时,它将存储其指针(当它是引用类型时)或将其打包(当它是值类型时,因为您在会话中存储了通用对象),从而创建一个副本。
当使用.Remove()删除保存对象的会话键时,这种删除是否清除了该内存空间或者仅仅是没有相关键但仍存在内部?
这取决于引用是否被视为垃圾。如果没有任何东西指向存储的引用,则会在最近的GC中删除它。
我之所以问这个问题,是因为我想知道在使用几个会话变量(例如在会话中存储大型对象和多个用户)时服务器性能是否受到影响,以及删除不再使用的对象的键是否有益于服务器内存使用,并且还要知道在删除这些键时内部会发生什么。
您不应将大型对象存储在会话中,因为它会影响性能。总体而言,大型对象都会带来问题(通常会移动到下一个GC代,这将导致它们的寿命延长-占用应用程序内存时间更长,可能会导致内存碎片化,导致垃圾收集时间更长)。
由于Session在内部使用索引器,并且其项存储为Hashtable,因此您可以将Session视为某种请求特定的数组。请注意,由于它随每个请求传递并且必须存储在某个地方,因此许多添加到其中的对象将持续与用户活动一样长时间。如果您有成千上万的用户,并且每个用户都存储了1MB,请想象一下在应用程序生命周期内将分配多少内存。

所以,例如如果我将一个对象分配给名为“BigObject”的Session变量,并且该变量是对该对象的唯一引用,一旦键被删除,它将被GC收集。这样对吗? - jecarfor
@jecarfor 没错。由于变量和会话项只是指针,不代表实际值本身,一旦没有其他对该对象的引用,垃圾回收器将认为它是垃圾并将其删除。 - kamil-mrzyglod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接