引用存储在会话变量中的对象的变量是否会被GC收集?
本文关键字:变量 GC 收集 是否 对象 会话 存储 引用 | 更新日期: 2023-09-27 17:49:52
我不太熟悉垃圾收集是如何工作的以及导致内存泄漏的原因。但是我现在开始关注这个问题,想要编写更高效的代码。我正在做的项目,是一个Asp。. Net web应用程序,在全局中启动会话时创建自定义dataccriteria的实例。asax,然后存储在Session变量中。这个自定义的dataccriteria是我们用来与数据库通信的CRUD方法。
第一个问题是,假设我们有一个Person类,在这个Person类中有一个DataCriteria字段,它被设置为DataCriteria的会话变量实例。因为Person的实例持有对dataccriteria实例的引用,直到Session结束才会被处理,那么Person的实例能够被收集吗?或者直到会议结束,Person的每个实例都不会被处理。
第二个问题更一般,但同样的问题。基本上,我想知道在引用dataccriteria的会话变量实例的方法中声明的变量是否能够由GC收集?还是会一直持续到会议结束?
我感谢你在这里给我的所有建议。如果你知道任何关于理解垃圾收集和避免内存泄漏的好读物,我也很乐意听到。对象持有的引用不影响其垃圾收集的可用性。然而,反过来就不正确了。例如,假设实例A有一个包含实例B的字段,只要没有其他实例引用它,即使B是静态的或"长期存在的",A也会被垃圾收集使用。但是,在A可以进行垃圾收集之前,B将无法进行垃圾收集至少。
在引用不太明显的地方,事情会变得有点奇怪。例如,当实例C订阅由D公开的事件时,实例C被实例D引用。这意味着,如果D是长寿命的,除非C取消订阅事件,否则C将无法在D之前进行垃圾收集。通过事件和其他委托保存的引用实际上造成了。net应用程序中大部分的"内存"泄漏。(正确地说,这些并不是真正的内存泄漏,因为没有实际的失败来清理不被实际对象实例使用的内存。)
对象引用构成一个有向图——对象a引用对象B。除非a被收集,否则B不能被收集。
Session只是另一个引用东西的对象——在这种情况下,它是对象A引用对象B。
所以在你的例子中,仅仅因为Person引用了一些也存储在Session中的东西并不意味着Person会一直存在直到Session消失。除非Session引用了你的Person,否则它们的生命周期不会被链接。
现在你需要注意的是你的dataccriteria还引用了什么。如果它保存数据库连接或其他对象,它们将与会话一样存在。