2017-09-05 133 views
0

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

在这里你可以看到输出:

(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> 
+0

如果你的应用在2GB设备上工作正常,但不在4GB设备上,并且'android:largeHeap =“true”'对你的问题不起作用,那么它是有线的?你能否显示你的清单代码? –

+0

@ GraceFeng-MSFT我用清单文件编辑了问题。我在应用程序中绘制了相当多的位图,并且显示器从HD发展到了Quad HD,因此这是更多内存使用的原因。 – hoacin

回答

1

属性android:largeHeap="true"属于application标签,请在这里正式文件:application。您将此属性置于manifest标记中,这应该是android:largeHeap="true"不适用于您的应用的原因。顺便说一下,也许这是脱离主题,因为你的问题是由大位图引起的,使用本机内存(NDK & JNI)实际上可以绕过堆大小的限制。你可以检查这种情况:JNI bitmap operations , for helping to avoid OOM when using large images

+0

解决了这个问题。我想我以后会从堆中移除所有这些大型应用程序生命周期资源,您的链接似乎是开始的好地方。谢谢! – hoacin