引用存储在Session变量中的对象的变量是否由GC收集?

| 我对垃圾回收的工作原理和导致内存泄漏的原因不是很熟悉。但是我正要对此加以关注,并希望编写更有效的代码。因此,我正在处理的项目是Asp.Net Web应用程序,当Session在global.asax中启动时创建了一个自定义DataCriteria实例,然后将其存储在Session变量中。此自定义DataCriteria是我们用来与数据库进行CRUD方法通信的工具。 第一个问题是,假设我们有一个Person类,并且在此Person类中有一个DataCriteria字段,该字段设置为DataCriteria的Session变量实例。由于Person实例拥有对DataCriteria实例的引用,该引用在Session结束之前不会被废弃,因此该Person实例将能够被收集。否则,直到该会话结束之前,不会处理Person的每个实例。 第二个问题更笼统,但同样。基本上,我想知道在GC中是否可以在引用DataCriteria的Session变量实例的方法中声明的变量进行收集?还是会一直保留到会议结束? 我感谢您在这里给我的所有建议。而且,如果您了解用于理解垃圾回收并避免内存泄漏的任何好读物,我也很想听听它们。     
已邀请:
对象持有的引用不会影响其垃圾回收的可用性。但是,反事实并非如此。例如,假设实例A的字段包含实例B。即使B是静态的或“长寿”的,只要没有其他引用,A将可用于垃圾回收。但是,至少直到A可用于垃圾收集,B才可用于垃圾收集。 引用可能不太明显的地方可能会有些奇怪。例如,当实例C订阅由实例D公开的事件时,实例C将被实例D引用。这意味着,如果D是长期存在的,除非在C中取消订阅该事件,否则C将无法在D之前用于垃圾回收。通过事件和其他委托持有的引用实际上是导致.NET应用程序中大多数“内存”泄漏的原因。 (正确地说,这些并不是真正的内存泄漏,因为没有实际的失败来清除实际对象实例未使用的内存。)     
对象引用构成有向图-对象A引用对象B。在收集A之前,B不能。 会话只是引用对象的另一个对象-在这种情况下,它是引用对象B的对象A。 因此,在您的情况下,仅仅是因为Person引用了也存储在Session中的内容,并不意味着Person会一直呆到Session消失。除非Session引用您的Person,否则它们的生命周期不会链接。 现在,您需要注意的是DataCriteria引用的其他内容。如果它拥有数据库连接或其他对象,则它们将与会话一样有效。     

要回复问题请先登录注册