android - 缩放位图分配失败 - Xamarin Visual Studio

标签 android memory xamarin crash xamarin.android

我有一个包含丰富图像的主页(在线感染的 20KB 到 300KB 提要)。我有另一个页面,在重构的圆圈中显示联系人及其图像(20KB 到 300KB)。在联系页面上,它是一个包含 3 个 fragment 的选项卡。当我从 fragment 1 切换到 2 到 3 并重复反之亦然时,我的应用程序停止工作并抛出错误。

此外,当应用程序启动主页并且我滚动浏览提要时,当我移动到下一个 Activity (联系页面)时,它在到达联系页面之前会有点滞后(几秒钟后,它会崩溃) 。看看我的日志,这就是我所看到的,我一直在努力寻找出路。

在我的所有 Activity 中,我都包含了 GC.Collect() 来为其他 Activity 获得更多空间,但仍然不适合我。

顺便说一句,我已将应用程序中的 java 堆大小增加到 1G。我还在我的联系页面上处理了位图。

知道是什么导致了这个问题吗?

异常

[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_nonvirtual_object_method'.
[Mono] Probing 'java_interop_jnienv_call_nonvirtual_object_method'.
[Mono] Found as 'java_interop_jnienv_call_nonvirtual_object_method'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_void_method_a'.
[Mono] Probing 'java_interop_jnienv_call_void_method_a'.
[Mono] Found as 'java_interop_jnienv_call_void_method_a'.
[Mono] Assembly Ref addref Xamarin.Android.Support.Design[0x7cf85210] -> Xamarin.Android.Support.Core.UI[0x7ce7c4a8]: 4
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_new_local_ref'.
[Mono] Probing 'java_interop_jnienv_new_local_ref'.
[Mono] Found as 'java_interop_jnienv_new_local_ref'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Probing 'java_interop_jnienv_call_boolean_method_a'.
[Mono] Found as 'java_interop_jnienv_call_boolean_method_a'.
[Adreno-EGL] <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build:  ()
[Adreno-EGL] OpenGL ES Shader Compiler Version: E031.24.00.07
[Adreno-EGL] Build Date: 01/22/14 Wed
[Adreno-EGL] Local Branch: base_au149_adreno_au169_patches
[Adreno-EGL] Remote Branch: 
[Adreno-EGL] Local Patches: 
[Adreno-EGL] Reconstruct Branch: 
[OpenGLRenderer] Enabling debug mode 0
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_int_method'.
[Mono] Probing 'java_interop_jnienv_call_int_method'.
[Mono] Found as 'java_interop_jnienv_call_int_method'.
[Mono] Assembly Ref addref Xamarin.Android.Support.v7.AppCompat[0x7d0e4ac0] -> Xamarin.Android.Support.Compat[0x7bbff618]: 4
[dalvikvm-heap] Grow heap (frag case) to 43.690MB for 14449048-byte allocation
[RecyclerView] No adapter attached; skipping layout
[RecyclerView] No adapter attached; skipping layout
[RecyclerView] No adapter attached; skipping layout
[RecyclerView] No adapter attached; skipping layout
[Mono] GC_TAR_BRIDGE bridges 24 objects 34 opaque 8 colors 24 colors-bridged 24 colors-visible 24 xref 6 cache-hit 0 cache-semihit 0 cache-miss 0 setup 0.05ms tarjan 0.10ms scc-setup 0.05ms gather-xref 0.00ms xref-setup 0.00ms cleanup 0.04ms
[Mono] GC_BRIDGE: Complete, was running for 25.34ms
[Mono] GC_MAJOR_SWEEP: major size: 784K in use: 199K
[Mono] GC_MAJOR: (user request) time 3.53ms, stw 3.72ms los size: 1024K in use: 8K
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_void_method'.
[Mono] Probing 'java_interop_jnienv_call_void_method'.
[Mono] Found as 'java_interop_jnienv_call_void_method'.
[Mono] Assembly Ref addref Xamarin.Android.Support.Fragment[0x7cfeb058] -> Xamarin.Android.Support.Core.UI[0x7ce7c4a8]: 5
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_field_id'.
[Mono] Probing 'java_interop_jnienv_get_field_id'.
[Mono] Found as 'java_interop_jnienv_get_field_id'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_int_field'.
[Mono] Probing 'java_interop_jnienv_get_int_field'.
[Mono] Found as 'java_interop_jnienv_get_int_field'.
[Mono] Assembly Ref addref Xamarin.Android.Support.v7.RecyclerView[0x7d4d3508] -> Xamarin.Android.Support.Core.UI[0x7ce7c4a8]: 6
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_object_array_element'.
[Mono] Probing 'java_interop_jnienv_get_object_array_element'.
[Mono] Found as 'java_interop_jnienv_get_object_array_element'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_set_boolean_field'.
[Mono] Probing 'java_interop_jnienv_set_boolean_field'.
[Mono] Found as 'java_interop_jnienv_set_boolean_field'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_set_int_field'.
[Mono] Probing 'java_interop_jnienv_set_int_field'.
[Mono] Found as 'java_interop_jnienv_set_int_field'.
Thread started: <Thread Pool> #2
Thread started: <Thread Pool> #3
[Mono] [0x853813e8] worker starting
Thread started: <Thread Pool> #4
Thread started: <Thread Pool> #5
[Mono] [0x85e6fb88] worker starting
[Mono] [0x85e6ffd8] worker starting
Thread started: <Thread Pool> #6
[Mono] [0x85e7bcf8] worker starting
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_field_id'.
[Mono] Probing 'java_interop_jnienv_get_static_field_id'.
[Mono] Found as 'java_interop_jnienv_get_static_field_id'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_get_static_object_field'.
[Mono] Probing 'java_interop_jnienv_get_static_object_field'.
[Mono] Found as 'java_interop_jnienv_get_static_object_field'.
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_call_nonvirtual_boolean_method_a'.
[Mono] Probing 'java_interop_jnienv_call_nonvirtual_boolean_method_a'.
[Mono] Found as 'java_interop_jnienv_call_nonvirtual_boolean_method_a'.
[Mono] [0x85e6ffd8] hill climbing, change max number of threads 4
[Choreographer] Skipped 34 frames!  The application may be doing too much work on its main thread.
[Mono] [0x85e6ffd8] hill climbing, change max number of threads 5
Thread started: <Thread Pool> #7
Thread started: <Thread Pool> #8
[Mono] [0x85de0cb8] worker starting
[Mono] [0x85e19438] worker starting
[dalvikvm-heap] Clamp target GC heap from 134.009MB to 128.000MB
[dalvikvm-heap] Clamp target GC heap from 138.888MB to 128.000MB
[dalvikvm-heap] Forcing collection of SoftReferences for 1575952-byte allocation
[dalvikvm-heap] Clamp target GC heap from 142.888MB to 128.000MB
[dalvikvm-heap] Out of memory on a 1575952-byte allocation.
[skia] --- allocation failed for scaled bitmap
[dalvikvm-heap] Clamp target GC heap from 142.888MB to 128.000MB
[dalvikvm-heap] Forcing collection of SoftReferences for 921616-byte allocation
[dalvikvm-heap] Clamp target GC heap from 142.888MB to 128.000MB
[dalvikvm-heap] Out of memory on a 921616-byte allocation.
[skia] --- allocation failed for scaled bitmap
[Mono] Image addref System.Runtime.Serialization[0x82d6fad0] -> System.Runtime.Serialization.dll[0x82d6ece8]: 2
[Mono] Prepared to set up assembly 'System.Runtime.Serialization' (System.Runtime.Serialization.dll)
[Mono] Assembly System.Runtime.Serialization[0x82d6fad0] added to domain RootDomain, ref_count=1
[Mono] AOT: image 'System.Runtime.Serialization.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-115/libaot-System.Runtime.Serialization.dll.so" not found
[Mono] AOT: image '/usr/local/lib/mono/aot-cache/arm/System.Runtime.Serialization.dll.so' not found: dlopen failed: library "/data/app-lib/com.companyname.peaceapp.peaceapp-115/libaot-System.Runtime.Serialization.dll.so" not found
[Mono] Config attempting to parse: 'System.Runtime.Serialization.dll.config'.
[Mono] Config attempting to parse: '/usr/local/etc/mono/assemblies/System.Runtime.Serialization/System.Runtime.Serialization.config'.
[Mono] Assembly Ref addref Mono.Android[0x7d63cb60] -> System.Runtime.Serialization[0x82d6fad0]: 2
[Mono] Assembly Ref addref System.Runtime.Serialization[0x82d6fad0] -> mscorlib[0x72798a08]: 31
Loaded assembly: System.Runtime.Serialization.dll [External]
Thread finished: <Thread Pool> #5
[Mono] [0x85e6ffd8] worker finishing

最佳答案

您可以在 list 中或通过 Application 子类上的属性请求 LargeHeap

list (应用程序部分)

android:largeHeap

应用程序子类属性:

[Application(LargeHeap = true)]
public class XamarinAndroidApp : Application
{
   ~~~~
}

只是一个请求,根据设备的不同,您可能会或可能不会获得增加的 Java/Dalvik 堆,并且您的应用不应依赖于获得增加的堆尺寸。

Most apps should not need this and should instead focus on reducing their overall memory usage for improved performance. Enabling this also does not guarantee a fixed increase in available memory, because some devices are constrained by their total available memory.

正如您的错误所示,您的 Java 堆在该设备上被限制为 128MB,这是适中的堆大小,因为在较旧的低端设备和较新的高端设备上它们的范围可以低至 16MB -终端设备最多可达到 512MB(在某些设备上甚至更多)。但请注意,堆大小对于每个设备都是可变的,并且是硬连线的(/system/build.prop),除了让您的应用程序请求 LargeHeap.

真正的解决方案包括:

  • 确保您已分析应用的分配并且没有泄漏内存
  • 您没有通过隐藏或不显示的FragmentView等方式持有对位图的引用,从而无法收集和释放它们
  • 您正在使用位图缓存(即 LruCache)来管理任意给定时间内存中保存的位图数量
  • 实际保存在内存中的位图的大小适合设备的分辨率,即:
    • 动态调整设备上的内容大小并缓存结果
    • 通过您请求的网络服务动态获取

关于android - 缩放位图分配失败 - Xamarin Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44367972/

相关文章:

android - 如何实现Expandablelistview子自定义布局?

android - 在android中,如何在类文件中以编程方式设置抽屉导航标题图像和名称?

c# - 从 PackagePart 流读取不释放内存

c++ - 段错误(核心转储)C++,因为我使用了大量内存

visual-studio - 如何更改 Xamarin.Forms(可移植)应用程序中的 PCL 配置文件

android - 解析十六进制 '0x0976b8' 为 android 着色

java - 将 String[] 传递给另一个 Android 类(使用 Intent )

具有 char 成员的结构的自定义 memcmp()

android - BottomSheet - 不正确的设计行为

ios - 从同一个 TableViewCell 打开不同的 ViewControllers(像 facebook 通知)