【问题标题】:Android App Startup Problems (Growing Heap)Android 应用启动问题(堆增长)
【发布时间】:2014-09-17 17:57:26
【问题描述】:

我的应用程序有一个很大的问题。 我们需要很多空间来进行位图转换,但是 直接在(应用程序的)启动时,大部分内存都被分配了未知的东西...... 您可以在下面找到 Xamarin Studio 的控制台输出。 什么可能触发如此大的分配? 该应用程序在不同的设备上进行了测试,下面的输出来自最差的一个(三星 Galaxy S3)

这是我的 MainActivity 的 OnCreate:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);
}

控制台输出:

Forwarding debugger port 8808
Detecting existing process
Loaded assembly: /storage/emulated/0/Android/data/com.#AppName#.#AppName#/files        /.__override__/#AppName#.dll
Loaded assembly: Mono.Android.dll [External]
Loaded assembly: System.Core.dll [External]
Loaded assembly: MonoDroidConstructors [External]
[monodroid-debug] Trying to initialize the debugger with options: --debugger-    agent=transport=dt_socket,loglevel=0,address=127.0.0.1:8808,server=y,embedding=1
[libc] WARNING: generic atexit() called from legacy shared library
[Mono] Image addref mscorlib[0x57bc76f0] -> mscorlib.dll[0x41d0f588]: 1
[Mono] AOT module 'mscorlib.dll.so' not found: dlopen failed: library "/data        /data/com.#AppName#.#AppName#/lib/mscorlib.dll.so" not found
[Mono] Assembly mscorlib[0x57bc76f0] added to domain RootDomain, ref_count=1
[Mono] Assembly Loader probing location: '/storage/emulated/0/Android        /data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll'.
[Mono] Image addref #AppName#[0x57bc9dd8] -> /storage/emulated/0/Android        /data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll[0x57bc9008]: 2
[Mono] Assembly #AppName#[0x57bc9dd8] added to domain RootDomain, ref_count=1
[Mono] AOT module '/storage/emulated/0/Android/data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll.so' not found: dlopen failed: library "/data    /data/com.#AppName#.#AppName#/lib//storage/emulated/0/Android/data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll.so" not found
[Mono] Assembly Loader loaded assembly from location: '/storage/emulated/0/Android/data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll'.
[Mono] Config attempting to parse: '/storage/emulated/0/Android/data/com.#AppName#.#AppName#/files/.__override__/#AppName#.dll.config'.
[Mono] Config attempting to parse: '/Users/builder/data/lanes/1131/2a7b6821/source/monodroid/builds/install/mono-armv7/etc/mono/assemblies/#AppName#/#AppName#.config'.
[monodroid-gc] GREF GC Threshold: 46800
[Mono] Image addref Mono.Android[0x57bcac10] -> Mono.Android.dll[0x57bca250]: 1
[Mono] Assembly Mono.Android[0x57bcac10] added to domain RootDomain, ref_count=1
[Mono] AOT module 'Mono.Android.dll.so' not found: dlopen failed: library "/data/data/com.#AppName#.#AppName#/lib/Mono.Android.dll.so" not found
[Mono] Assembly Ref addref Mono.Android[0x57bcac10] -> mscorlib[0x57bc76f0]: 2
[Mono] Image addref System.Core[0x59182658] -> System.Core.dll[0x59181a40]: 1
[Mono] Assembly System.Core[0x59182658] added to domain RootDomain, ref_count=1
[Mono] AOT module 'System.Core.dll.so' not found: dlopen failed: library "/data/data/com.#AppName#.#AppName#/lib/System.Core.dll.so" not found
[Mono] Assembly Ref addref Mono.Android[0x57bcac10] -> System.Core[0x59182658]: 2
[Mono] Assembly Ref addref System.Core[0x59182658] -> mscorlib[0x57bc76f0]: 3
[Mono] Assembly Ref addref #AppName#[0x57bc9dd8] -> Mono.Android[0x57bcac10]: 2
[Mono] DllImport attempting to load: '__Internal'.
[Mono] DllImport loaded library '(null)'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for '_monodroid_gc_wait_for_bridge_processing'.
[Mono] Probing '_monodroid_gc_wait_for_bridge_processing'.
[Mono] Found as '_monodroid_gc_wait_for_bridge_processing'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for '_monodroid_get_identity_hash_code'.
[Mono] Probing '_monodroid_get_identity_hash_code'.
[Mono] Found as '_monodroid_get_identity_hash_code'.
[Mono] Assembly Ref addref #AppName#[0x57bc9dd8] -> mscorlib[0x57bc76f0]: 4
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for '_monodroid_gref_log_new'.
[Mono] Probing '_monodroid_gref_log_new'.
[Mono] Found as '_monodroid_gref_log_new'.
[dalvikvm-heap] Grow heap (frag case) to 12.344MB for 2005072-byte allocation
[dalvikvm-heap] Grow heap (frag case) to 19.993MB for 8020240-byte allocation
[dalvikvm-heap] Grow heap (frag case) to 32.004MB for 11632656-byte allocation
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for '_monodroid_gref_log_delete'.
[Mono] Probing '_monodroid_gref_log_delete'.
[Mono] Found as '_monodroid_gref_log_delete'.

感谢您的帮助!

编辑:

在清单中使用 LargeHeap 没有帮助。 当我加载完全没有布局的应用程序时,堆大小也增长到 19mb。

【问题讨论】:

  • HelloWorld 应用程序运行时内存(在 100MB 堆中)使用 ~15MB(在发布中)~14MB(在发布/aot/llvm 中)~16MB(在调试模式下,没有附加调试器),~17MB (在调试模式下),其中包括 Mono(基于 NDK)运行时、一些 .Net 程序集、Java 桥、启动活动等......在启动时听起来对我来说......

标签: android xamarin out-of-memory


【解决方案1】:

如果您没有使用自定义Application 类,即setContentView(),那么您有一行代码可能会导致内存分配。您的布局 xml 上可能有大图像或太多图像。尝试简化您的布局 xml 或使用较小的图像。如果您没有出现内存不足异常,则无需更改此设置;但是您将需要更多空间来进行图像操作,因此您可以这样做(但不建议这样做):android:largeHeap="true"

【讨论】:

  • 我已经尝试了这两种方法。如果没有 SetContentView(),堆大小约为 19mb,我认为这也太大了。 LargeHeap 已激活,但无济于事...
【解决方案2】:

我发现了问题。 在我的可绘制文件夹中不是正确的 Icon.png。 我使用的图标的分辨率为 708x708。我把它换成一个更小的,现在它可以工作了...... 感谢 Ercan 将我推向正确的方向。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 2013-02-11
    • 2013-01-09
    • 1970-01-01
    • 2013-07-19
    • 2012-06-28
    • 2013-03-20
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多