【问题标题】:How to increase heap size in c# xamarin application?如何在 c# xamarin 应用程序中增加堆大小?
【发布时间】:2017-09-05 21:57:57
【问题描述】:

我使用 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>

【问题讨论】:

  • 如果您的应用程序在 2GB 设备上运行良好但在 4GB 设备上运行良好,并且android:largeHeap="true" 不适用于您的问题,则表示已连接?你能显示你的清单代码吗?
  • @GraceFeng-MSFT 我用清单文件编辑了问题。我在我的应用程序中绘制了相当多的位图,并且显示从 HD 增长到 Quad HD,所以这就是使用更多内存的原因。

标签: xamarin.android heap-memory


【解决方案1】:

属性android:largeHeap="true"属于application标签,请查看官方文档:application。你把这个属性放在manifest标签中,这应该是android:largeHeap="true"不适用于你的应用的原因。

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

【讨论】:

  • 解决了这个问题。我想我稍后会从堆中删除所有这些大型应用程序生命周期资源,您的链接似乎是开始的好地方。谢谢!
猜你喜欢
  • 2021-02-06
  • 2012-07-01
  • 2017-09-05
  • 1970-01-01
  • 2016-07-09
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多