在最近的一个项目中,我发现了许多静态类所持有的公共静态变量。其中一些是字符串,但其他是名为“Member”的类的实例。总的来说,我有大约17151个这样的静态实例。
问题: 1)哪些静态实例被认为是GC根?所有这些还是只有会员实例?我猜测字符串将被忽略,因为字符串是一个不可变类型,并且不包含对其他类型的引用。
2)你的建议是什么?要使“成员”类成为一个结构(它非常轻,它只有3-4个int或bool类型的字段)或者可能创建成员的惰性实例? (声明仅在需要时创建成员实例的静态属性)或其他建议......我会指出任何想法
由于我将成员视为不可变的,并且成员没有将实例保存到其他对象,是否有可能指示GC停止将这些实例视为beyind GC根?
谢谢!
答案 0 :(得分:2)
哪些静态实例被认为是GC根?所有这些或仅 会员实例?。
所有静态成员都被视为GC根。
我猜这些字符串将被忽略,因为它已经成为了GC的根源 string是一个不可变类型,不包含对其他的引用 类型。
这是不正确的。在类型上声明的静态字符串将与下一个不同类型的静态成员一样多。
你的建议是什么?
我的建议是首先看看所有这些实例是否真的导致你内存压力。如果是,那么我会重新考虑为什么你首先需要所有这些静态实例?他们都需要在整个生命周期中生活吗?他们可以缓存吗?他们真的应该是静态成员吗?你可以问自己有很多问题需要改进。