.NET垃圾收集器有很多静态变量

时间:2015-11-16 10:46:40

标签: c# static garbage-collection immutability

在最近的一个项目中,我发现了许多静态类所持有的公共静态变量。其中一些是字符串,但其他是名为“Member”的类的实例。总的来说,我有大约17151个这样的静态实例。

问题: 1)哪些静态实例被认为是GC根?所有这些还是只有会员实例?我猜测字符串将被忽略,因为字符串是一个不可变类型,并且不包含对其他类型的引用。

2)你的建议是什么?要使“成员”类成为一个结构(它非常轻,它只有3-4个int或bool类型的字段)或者可能创建成员的惰性实例? (声明仅在需要时创建成员实例的静态属性)或其他建议......我会指出任何想法

由于我将成员视为不可变的,并且成员没有将实例保存到其他对象,是否有可能指示GC停止将这些实例视为beyind GC根?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

哪些静态实例被认为是GC根?所有这些或仅   会员实例?。

所有静态成员都被视为GC根。

  

我猜这些字符串将被忽略,因为它已经成为了GC的根源   string是一个不可变类型,不包含对其他的引用   类型。

这是不正确的。在类型上声明的静态字符串将与下一个不同类型的静态成员一样多。

  

你的建议是什么?

我的建议是首先看看所有这些实例是否真的导致你内存压力。如果是,那么我会重新考虑为什么你首先需要所有这些静态实例?他们都需要在整个生命周期中生活吗?他们可以缓存吗?他们真的应该是静态成员吗​​?你可以问自己有很多问题需要改进。