如何在c#xamarin应用程序中增加堆大小?

时间:2017-09-05 21:57:58

标签: xamarin.android heap-memory

我使用xamarin在c#中开发了一个android应用程序。它使用了大量内存。很长一段时间,我使用较弱的2GB设备成功运行它。现在我换了4GB设备的手机,然后突然出现内存异常。这是由创建更大的位图引起的。

在这里您可以看到输出:

(13022): Starting a blocking GC Alloc
(13022): Clamp target GC heap from 271MB to 256MB
(13022): Alloc concurrent mark sweep GC freed 4(96B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 172us total 13.525ms
(13022): Forcing collection of SoftReferences for 833KB allocation
(13022): Starting a blocking GC Alloc
(13022): Clamp target GC heap from 271MB to 256MB
(13022): Alloc concurrent mark sweep GC freed 5(120B) AllocSpace objects, 0(0B) LOS objects, 0% free, 255MB/256MB, paused 175us total 13.474ms
(13022): Out of memory: Heap Size=256MB, Allocated=255MB, Capacity=256MB

我尝试了所有可能的设置Java Max Heap Size = 1G和写入清单android:largeHeap="true"的组合,如同建议的here,但它仍然说我只有256MB,在同一点崩溃。任何想法为什么我没有获得更多的堆内存?系统中有很多可用内存。到时候,我会做一些优化,但目前我想使用我的测试设备的全部功能来编写简单的方法。我查看了各种文章,问题和两个突出显示的行动中的一个始终解决了问题。我不知道我的代码中出现了什么错误。

修改:

这里是整个清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="AlienChessAndroid.AlienChessAndroid" android:versionCode="1" android:versionName="1.0" android:largeHeap="true" android:installLocation="auto">
<uses-sdk android:minSdkVersion="23" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="Alien Chess" android:icon="@drawable/Alien">
</application>
</manifest>

1 个答案:

答案 0 :(得分:1)

属性android:largeHeap="true"属于application标记,请在此处查看官方文档:application。您将此属性放在manifest标记中,这应该是android:largeHeap="true"不适用于您的应用的原因。

顺便说一句,也许它不在主题,因为你的问题是由大位图引起的,使用本机内存(NDK和JNI)实际上可以绕过堆大小限制。您可以查看此案例:JNI bitmap operations , for helping to avoid OOM when using large images