Java.lang.OutOfMemoryError. Pensez à augmenter la valeur de $ (JavaMaximumHeapSize). Java a manqué de mémoire lors de l'exécution de 'Java.exe'
J'obtiens une exception de mémoire dans mon projet Visualstudio Xamarin. Aidez-moi à résoudre ce problème.
Si vous souhaitez augmenter la taille de segment de mémoire de votre application (pas le processus de génération), vous pouvez définir cela dans votre fichier AndroidManifest.xml:
<application Android:largeHeap="true"></application>
Pour visual studio 2015, cliquez avec le bouton droit de la souris sur Projet -> Propriétés -> Android Options -> Options avancées et taille de segment ici.
A partir de Xamarin studio version 6.3 et de visual studio 7.0.1, vous pouvez trouver ici la possibilité d’augmenter la taille du segment de mémoire.
Faites un clic droit sur le projet Android puis choisissez les options et choisissez Construire / Android Build , puis Avancé onglet et définir 1G (ou quelque chose) dans taille du segment de mémoire Java
Lorsque vous manquez de taille de segment 1G, commencez à optimiser les ressources.
Commencez par vérifier si vous ne dupliquez pas les instances d’images, en gardant plusieurs fois la même image en mémoire. Pour cette utilisation, utilisez la bibliothèque ffimageloading ( https://github.com/luberda-molinet/FFImageLoading ) pour le télécharger facilement et rapidement sur un nuget.
Optimisez ensuite les images que vous utilisez. Pour les grandes images, autres que les icônes, essayez de tout convertir en jpeg en évitant les png avec transparence, qui m’avaient autrefois permis de conserver une valeur constante.
Essayez ensuite d’utiliser des vignettes au lieu d’images lorsque vous pouvez avoir de grandes images téléchargées à distance. Sur votre serveur, créez des miniatures pour différentes tailles (mini, petit, moyen, normal, grand, xlarge, etc.) et ne chargez que les images dont vous avez réellement besoin. Cela économise beaucoup de mémoire et de vitesse.
Un autre problème concerne les fuites de mémoire. Il se peut que des cellules ou d’autres éléments résident toujours dans la mémoire s’ils ne se sont pas désabonnés des messages, des gestionnaires d’événements, etc. Imaginez que vous puissiez avoir plusieurs copies d'une liste complète d'images encore en mémoire quand vous êtes certain que cela ne pourrait pas arriver. Plus d'infos ici:
https://forums.xamarin.com/discussion/123876/should-we-unsubscribe-all-events-for-memory-management
D'après mon expérience, les problèmes de mémoire surviennent UNIQUEMENT sur la version Android de l'application Xamarin.Forms. Et elle doit toujours traiter les images de grande taille. J'ai traité ce problème en utilisant FFImageLoading ( https://github.com/luberda-molinet/FFImageLoading )
Remplacez votre
<Image Source="waterfront.jpg" />
Avec
<ffimageloading:CachedImage Source="waterfront.jpg"
DownsampleToViewSize = true,
BitmapOptimizations = true/>
Vous constaterez une nette amélioration des performances, qui résoudra également vos problèmes de mémoire.
J'avais corrigé l'ajout ci-dessous dans la balise d'application de AndroidManifiest.xml
<application Android:largeHeap="true" Android:label="sample"></application>