我正在使用会话变量来存储对象,方法是将它们分配给相应的会话密钥.因为这些变量是特定于会话的,所以它们不会被垃圾收集器收集,而是被会话超时清除.为了删除这些会话变量,我必须删除包含我不想再使用的对象的键.
将对象分配给会话变量时,该会话密钥是指向对象引用本身还是创建另一个引用?
当使用.Remove()删除保存对象的会话密钥时,此删除是否会清除该内存空间,或者它是否仍存在于引擎盖下但没有相关密钥?
我问这个是因为我想知道在使用多个会话变量(例如会话中的大对象和许多用户)时服务器性能是否受到影响,要知道是否删除不再使用的对象的密钥会导致有利于服务器内存的使用,也可以了解删除这些密钥后会发生什么.
最佳答案 从我的基本理解 – 当你将一个变量分配给会话密钥时,它将存储它的指针(当它是一个引用类型时)或者它(当它是值类型时,因为你在会话中存储一般对象),因此创建它的副本.
And when a session key that holds an object is removed by using .Remove(), Does this removal clears that memory space or does it still exist under the hood but without a related key?
这取决于引用是否被认为是垃圾.如果没有任何内容指向存储的引用,则将使用最近的GC删除它.
I’m asking this because I want to know if server performance is affected when using several session variables(e.g. big objects in session and many users), to know if removing the keys of the objects that are not going to be used anymore causes a benefit in server memory usage, and also to know what happens under the hood when these keys are removed.
您不应该在会话中存储大对象,因为它总是会影响性能.大对象总体上存在问题(通常会移动到下一代GC生成,这将导致其延长的生命周期 – 将占用应用程序内存更长时间,可能导致内存碎片导致垃圾收集持续更长时间).
由于Session在内部使用索引器并且其项目存储为Hashtable,因此您可以认为Session是某种特定于请求的数组.考虑到因为它随每个请求传递并且必须存储在某个地方,所以添加到它的许多对象将持续多久,例如,用户有效.如果您有数千名用户并存储,例如每个1MB,想象一下将为应用程序生命周期分配多少内存.