2

我在 Mono for Android 中的垃圾收集器有问题,我正在研究它,并说我必须在每个 OnDestroy() 方法中手动放置 GC.Collect() 以释放我不使用的对象,我也在尝试为 Java.Lang.Objects 使用 Dispose,但应用程序仍在消耗和增加内存。我该如何解决?

4

1 回答 1

6

主要问题:这是一个实际问题吗?垃圾收集器本质上是不确定的,因此内存使用会发生很大变化。这不一定是问题。这只是事情的一部分。如果您经常用完全局引用或耗尽进程堆,那么这是一个问题。如果您只是看到 grefs 增加但当收集自然发生时它们减少,则可能不值得担心。

如果这是一个问题,我们需要有关问题所在的详细信息。例如,Bitmap实例很容易耗尽内存Bitmaps 的解决方案不一定适用于一般情况。

要获取更多信息,您可以启用全局引用消息以查看何时创建和销毁全局引用。

此外,我们不断更新 GC 启发式方法。适用于 Android 4.1.0 的 Mono 引入了一项更改,GC.Collet()一旦我们达到平台最大 gref 值的 80%(模拟器上为 1800 gref)的 gref 阈值,就会自动调用该更改。这应该消除了对OnDestroy()call的大部分需求GC.Collect(),尽管(一如既往)GC 可能会在“不合时宜的时刻”启动,所以GC.Collect()无论如何,显式可能更可取。

于 2012-04-23T17:52:39.687 回答