当分配和删除会话密钥时会发生什么
本文关键字:什么 会话密钥 分配 删除 | 更新日期: 2023-09-27 18:10:21
我使用会话变量通过将它们分配给相应的会话键来存储对象。因为这些变量是特定于会话的,所以垃圾收集器不会收集它们,而是通过会话超时清除它们。为了删除这些会话变量,我必须删除保存我不想再使用的对象的键。
当将一个对象赋值给一个会话变量时,该会话键是指向对象引用本身还是创建另一个引用?
当一个持有对象的会话键被使用。remove()删除时,这个删除是否清除了内存空间,或者它仍然存在,但没有相关的键?
我问这个,因为我想知道服务器性能是否受到影响时,使用几个会话变量(例如:会话中的大对象和许多用户),以便了解删除不再使用的对象的键是否会对服务器内存使用产生好处,并且还可以了解当这些键被删除时在底层发生了什么。
从我的基本理解-当你给会话键分配一个变量时,它将存储它的指针(当它是引用类型时)或框它(当它是值类型时,因为你在会话中存储一般对象),从而创建它的副本。
当一个持有对象的会话键被使用。remove()删除时,这个删除是否清除了内存空间,或者它仍然存在,但没有相关的键?
这取决于引用是否被认为是垃圾。如果没有指向存储的引用,它将被最近的GC删除。
我问这个,因为我想知道服务器性能是否受到影响时,使用几个会话变量(例如:(会话中的大对象和许多用户),以了解删除不再使用的对象的键是否会对服务器内存使用产生好处,并且还了解当这些键被删除时在底层发生了什么。
你不应该在会话中存储大的对象,因为它总是影响性能。总的来说,大对象是有问题的(通常会被转移到下一代GC,这将导致它们的生命周期延长——占用应用程序内存的时间更长,可能导致内存碎片,导致垃圾收集持续时间更长)。
由于Session
在内部使用索引器,并且它的项被存储为Hashtable
,因此可以认为Session
是某种特定于请求的数组。考虑到,由于它与每个请求一起传递,并且必须存储在某个地方,因此您添加到它中的许多对象将持续存在,例如,只要user处于活动状态。如果您有数千个用户,并为每个用户存储1MB,那么想象一下将为应用程序生命周期分配多少内存。