Xamarin.Android - GC正在停止我的应用程序2秒钟

时间:2014-07-16 14:53:10

标签: android garbage-collection xamarin

我的应用程序正在产生巨大的GC

GC_BRIDGE waiting for bridge processing to finish
GC_EXPLICIT freed 83K, 13% free 20422K/23303K, paused 3ms+6ms
GC_BRIDGE num-objects 8 num_hash_entries 192655 sccs size 182398 init 0.00ms df1 618.66ms sort 668.89ms dfs2 267.17ms setup-cb 92.16ms free-data 219.17ms user-cb 44.89ms clenanup 0.14ms links 15526347/15526347/159040609/136 dfs passes 28251143/27524490
GC_MINOR: (Nursery full) pause 643.96ms, total 644.45ms, bridge 1292.70ms promoted 0K major 33344K los 108818K

我的应用正在使用OpenGL,并使用GameLoop运行。在我使用Android GUI之前,我没有注意到任何大的GC。

我怀疑Android GUI中的一些代码编写得很糟糕。 我已经阅读了一些非常奇怪的(并且不是真的可以理解的)指南,比如在this documentation中(参见HiddenReference部分)。

我当然不会发送完整的源代码。我只是想学习如何调查。

我的问题是:

上面的消息是否提供有趣/有用的信息? (如何阅读)

GC_BRIDGE和GC_MINOR及其值的意义/如何理解?

2 个答案:

答案 0 :(得分:2)

所有这些信息都可以帮助您了解应用程序及其内存消耗情况。

取决于你在做什么,这可能不是问题。例如,当您分配高分辨率位图时,您将看到内存上升。但是,您的应用程序中存在内存泄漏的可能性很高。

在Android上,由于HeapShot工具不存在而难以跟踪它们(iOS与Xamarin Studio可用)。此工具可帮助您跟踪哪些对象保留在内存中。

如果有泄漏,有一种方法可以对活动进行双重检查。将GC.Collect()放在可以在应用程序中轻松触发的特定函数上。

完成此操作后,打开第一个活动(主要活动)并注意内存使用情况。打开另一个返回上一个并触发GC.Collect。注意内存使用情况。多次执行此过程,如果内存不断增长,则应用程序会出现泄漏。


大多数GC消息都有深入的描述on this website

幼儿园满read the Android Lead - Jonathan Pryor's answer

你也可以在我的应用中看到自己read this thread about GC_Bridge

答案 1 :(得分:-2)

每当您不确定枚举数是否会产生垃圾时,我就会使用<div ng-hide="labelIsAlphanumeric()" class="error-message"> Selected project label has non-alphanumeric characters! </div> 代替for(;;)。另外,删除Linq。最佳做法是每隔一段时间运行一个探查器,然后找到你在游戏循环中分配新对象的位置。

你不能在游戏循环中使用“新”或上述任何内容。而是事先预先分配所有内容,使用池化等 每隔1MB的分配大约会触发GC,然后你会看到帧丢失。

http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx10

http://community.monogame.net/t/solved-fps-drops-ever-1-2-minutes/2446