C# (Xamarin,Android)此代码如何帮助减少引用的实例?
我正在阅读Android的垃圾收集文档,我不太了解这段代码的机制C# (Xamarin,Android)此代码如何帮助减少引用的实例?,c#,xamarin,mono,garbage-collection,xamarin.android,C#,Xamarin,Mono,Garbage Collection,Xamarin.android,我正在阅读Android的垃圾收集文档,我不太了解这段代码的机制 class HiddenReference<T> { static Dictionary<int, T> table = new Dictionary<int, T> (); static int idgen = 0; int id; public HiddenReference () { lock (table) {
class HiddenReference<T> {
static Dictionary<int, T> table = new Dictionary<int, T> ();
static int idgen = 0;
int id;
public HiddenReference ()
{
lock (table) {
id = idgen ++;
}
}
~HiddenReference ()
{
lock (table) {
table.Remove (id);
}
}
public T Value {
get { lock (table) { return table [id]; } }
set { lock (table) { table [id] = value; } }
}
}
class BetterActivity : Activity {
HiddenReference<List<string>> strings = new HiddenReference<List<string>>();
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
strings.Value = new List<string> (
Enumerable.Range (0, 10000)
.Select(v => new string ('x', v % 1000)));
}
}
类隐藏引用{
静态字典表=新字典();
静态int idgen=0;
int-id;
公共隐藏引用()
{
锁(表){
id=idgen++;
}
}
~HiddenReference()
{
锁(表){
表.删除(id);
}
}
公共价值{
获取{lock(table){返回表[id];}}
设置{lock(table){table[id]=value;}}
}
}
班级活动:活动{
HiddenReference字符串=新的HiddenReference();
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
strings.Value=新列表(
可枚举范围(0,10000)
.选择(v=>newstring('x',v%1000));
}
}
HiddenReference是如何工作的?如果GC将递归地扫描BetterActivity引用的实例,它难道看不到字符串字段中的列表,然后是列表中的所有字符串吗?我想我错过了什么。感谢您的帮助
谢谢大家! 这个想法是
HiddenReference
有一个静态字典
。垃圾收集器将每个静态对象视为根对象。这意味着我们有一个托管的根对象。在这种情况下,GC桥不需要检查潜在的引用,因为它可以确保永远不会收集对象
注意:如果在GC过程中看到速度变慢,那么应该减少
活动中的引用。如果你的应用程序运行正常,就不用麻烦优化了。谢谢!答案很清楚。所以这个策略不仅仅是Xamarin,它可以用于其他一些.Net项目吗?和WinForm一样,WPF?这是Xamarin。仅限Android。我们必须确保javagc和monogc愉快地合作。引用漫游是这两个世界相互作用的结果。所以在一般的.Net项目中,GC不会进行递归扫描吗?为什么Mono需要进行一次引用漫游才能愉快地使用JavaGC?原谅我的无知,谢谢你~~!它与何时允许收集对象有关。只有当Java世界和托管世界都没有对它的引用时,我们才能放手。这个过程很复杂。在托管GC运行期间,我们将所有对Java对等对象的强引用替换为弱引用。然后触发本机集合。如果之后对象消失了,我们可以让托管对象消失(如果它符合收集条件)。否则,我们将重新创建强引用。为了防止收集对等点,我们必须检查所有潜在的引用,从而进行递归扫描。