在 Xamarin 中获取 OutOfMemoryException
Getting OutOfMemoryException in Xamarin
java.lang.OutOfMemoryError. Consider increasing the value of
$(JavaMaximumHeapSize). Java ran out of memory while executing
'java.exe'
我的 visualstudio Xamarin 项目出现内存不足异常请帮我解决这个问题。
我会增加您的构建堆大小。
右键单击您的 Android 项目 > 属性 > Android 选项 > 高级 > Java 最大堆大小。
如果您想增加应用程序(不是构建过程)的堆大小,您可以在 AndroidManifest.xml:
中进行设置
<application android:largeHeap="true"></application>
对于 visual studio 2015,右键单击项目 --> 属性 --> Android 选项 --> 高级和堆大小。
从 Xamarin Studio 版本 6.3 和 visual studio 7.0.1 开始,可以在此处找到增加堆大小的选项
右键单击 android 项目然后选择 options 然后选择 Build/Android Build,然后是 Advanced 选项卡并在 [=32= 中设置 1G (或其他) ] 堆大小
所选答案引导我朝着正确的方向前进,但对于 Visual Studio 2017 年,屏幕如下所示:
增加 java 最大堆大小对我有用
当你运行超出1G heap size时,开始优化资源。
首先检查你是否在复制图像实例,在内存中多次保存相同的图像。为此,请使用 ffimageloading 库 (https://github.com/luberda-molinet/FFImageLoading) 快速轻松地在 nuget 上获取它。
然后优化您正在使用的图片。对于图标以外的大图像,请尝试将所有内容都转换为 jpeg,避免透明的 png,这曾经让我免于不断的 ooms。
当您可能在远程上传了大图片时,请尝试使用缩略图而不是图片。在您的服务器上预先创建不同尺寸的缩略图,迷你、小型、中型、普通、大型、超大型等,并仅加载您真正需要的尺寸的图像。这样可以节省大量内存和速度。
另一个是内存泄漏。如果单元格或其他元素没有取消订阅消息、事件处理程序和其他一些元素,它们可能仍然驻留在内存中。想象一下,当您确定不会发生这种情况时,您可以在内存中保留一个充满图像的列表的多个副本。更多信息在这里:
https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management
我已修复在 AndroidManifiest.xml
的应用程序标签中添加以下内容
<application android:largeHeap="true" android:label="sample"></application>
根据我的经验,内存问题只发生在 android 版本的 Xamarin.Forms 应用程序上。而且它总是要处理大尺寸图像。我已经使用 FFImageLoading(https://github.com/luberda-molinet/FFImageLoading)
处理了这个问题
替换你的
<Image Source="waterfront.jpg" />
与
<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>
您会看到性能的显着提高,它还会解决您的内存问题。
java.lang.OutOfMemoryError. Consider increasing the value of $(JavaMaximumHeapSize). Java ran out of memory while executing 'java.exe'
我的 visualstudio Xamarin 项目出现内存不足异常请帮我解决这个问题。
我会增加您的构建堆大小。
右键单击您的 Android 项目 > 属性 > Android 选项 > 高级 > Java 最大堆大小。
如果您想增加应用程序(不是构建过程)的堆大小,您可以在 AndroidManifest.xml:
中进行设置<application android:largeHeap="true"></application>
对于 visual studio 2015,右键单击项目 --> 属性 --> Android 选项 --> 高级和堆大小。
从 Xamarin Studio 版本 6.3 和 visual studio 7.0.1 开始,可以在此处找到增加堆大小的选项
右键单击 android 项目然后选择 options 然后选择 Build/Android Build,然后是 Advanced 选项卡并在 [=32= 中设置 1G (或其他) ] 堆大小
所选答案引导我朝着正确的方向前进,但对于 Visual Studio 2017 年,屏幕如下所示:
增加 java 最大堆大小对我有用
当你运行超出1G heap size时,开始优化资源。
首先检查你是否在复制图像实例,在内存中多次保存相同的图像。为此,请使用 ffimageloading 库 (https://github.com/luberda-molinet/FFImageLoading) 快速轻松地在 nuget 上获取它。
然后优化您正在使用的图片。对于图标以外的大图像,请尝试将所有内容都转换为 jpeg,避免透明的 png,这曾经让我免于不断的 ooms。
当您可能在远程上传了大图片时,请尝试使用缩略图而不是图片。在您的服务器上预先创建不同尺寸的缩略图,迷你、小型、中型、普通、大型、超大型等,并仅加载您真正需要的尺寸的图像。这样可以节省大量内存和速度。
另一个是内存泄漏。如果单元格或其他元素没有取消订阅消息、事件处理程序和其他一些元素,它们可能仍然驻留在内存中。想象一下,当您确定不会发生这种情况时,您可以在内存中保留一个充满图像的列表的多个副本。更多信息在这里:
https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management
我已修复在 AndroidManifiest.xml
的应用程序标签中添加以下内容<application android:largeHeap="true" android:label="sample"></application>
根据我的经验,内存问题只发生在 android 版本的 Xamarin.Forms 应用程序上。而且它总是要处理大尺寸图像。我已经使用 FFImageLoading(https://github.com/luberda-molinet/FFImageLoading)
处理了这个问题替换你的
<Image Source="waterfront.jpg" />
与
<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>
您会看到性能的显着提高,它还会解决您的内存问题。