在Xamarin中获取OutOfMemoryException


76

java.lang.OutOfMemoryError。考虑增加$(JavaMaximumHeapSize)的值。Java执行'java.exe'时内存不足

我的visualstudio Xamarin项目中的内存不足异常。请帮助我如何解决此问题。


2
我不仅建议将LargeHeap设置为true。相反,您应该尝试找出导致该OOM的原因并进行修复。否则,您可能已经花了一些时间才能再次击中您。
龙舌兰酒猛击者

Answers:


124

我会增加您的构建堆大小。

右键单击您的Android项目>属性> Android选项>高级> Java最大堆大小

在此处输入图片说明


是的,你说的没错。但是我可以在Visual Studio Xamarin中增加我的应用程序大小。
Srinivas Ch

3
@SrinivasCh在清单中添加android:largeHeap="true"标签,然后观察您logcat是否Grow heap (frag case)看到ART试图分配更多内存
SushiHangover

效果很好感谢您的回复@lain Smith
Srinivas Ch

@SushiHangover啊,好的,我之前有那个错误,只是在这里堆了,但是如果您要使用大堆然后编辑菜单,那是正确的
Iain Smith

@ Srinivas-Ch不用担心
Iain Smith

20

选定的答案将我引向正确的方向,但是对于Visual Studio 2017,屏幕如下所示:

VS 2017更新的屏幕

VS 2017更新的屏幕


18

如果要增加应用程序的堆大小(而不是构建过程),可以在AndroidManifest.xml中进行设置:

<application android:largeHeap="true"></application>

12

对于Visual Studio 2015,右键单击项目->属性-> Android选项->高级,然后在其中堆大小。


使之成为:左键单击<project> .Droid->双击“属性”->单击左侧的“ Android选项”->单击“高级”选项卡->“ Java最大堆大小”
LionelGoulet

7

从Xamarin Studio 6.3版和Visual Studio 7.0.1版开始,可以在此处找到增加堆大小的选项

右键单击android项目,然后选择选项,然后选择Build / Android Build,然后选择Advanced选项卡并在Java堆大小中设置1G(或其他值)

在此处输入图片说明


4

当1G堆大小用完时,开始优化资源。

首先检查您是否不复制图像实例,将同一图像保留在内存中几次。为此,使用ffimageloading库(https://github.com/luberda-molinet/FFImageLoading)在nuget上快速便捷地获取它。

然后优化您正在使用的图像。对于除图标以外的大图像,请尝试将所有内容都转换为jpeg,避免使用具有透明度的png,这曾经为我节省了恒定的缩放比例。

然后,当您在遥控器上可能有较大的上载图像时,请尝试使用缩略图而不是图像。在您的服务器上,预先为不同大小的缩略图创建缩略图,这些缩略图包括mini,small,medium,normal,large,xlarge等,并且仅加载您真正需要的尺寸的图像。这样可以节省大量内存和速度。

另一个是内存泄漏。如果单元格或其他元素没有取消订阅消息,事件处理程序和其他一些元素,则它们可能仍驻留在内存中。想象一下,当您确定不可能发生时,可能有几张完整的图像列表仍在内存中。更多信息在这里:

https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management

https://forums.xamarin.com/discussion/87206/messaging-center-unsubscribe-from-all-messages-when-broadcast-stops


2

以我的经验,内存问题仅发生在Xamarin.Forms应用的android版本上。而且它总是必须处理大尺寸图像。我已经通过使用FFImageLoading(https://github.com/luberda-molinet/FFImageLoading)处理了这个问题

更换您的

<Image Source="waterfront.jpg" />

<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>

您将看到性能上的显着提高,并且还将解决您的内存问题。



-1

我已经修复了在AndroidManifiedt.xml的应用程序标签中添加以下内容的问题

<application  android:largeHeap="true" android:label="sample"></application>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.