2017-09-05 2 views
0

Je développe une application android, en C#, en utilisant xamarin. Il utilise beaucoup de mémoire. Pendant longtemps, j'ai utilisé un dispositif plus faible de 2 Go pour l'exécuter avec succès. Maintenant, j'ai changé de téléphone pour 4 Go de périphérique et soudainement, je reçois une exception de mémoire. Cela est dû à la création de bitmaps plus grands.Comment augmenter la taille du tas dans l'application C# xamarin?

Vous pouvez voir ici la sortie:

(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 

j'ai essayé toutes les combinaisons possibles de la mise en Java Max Heap Size = 1G et écrit à manifester android:largeHeap="true" comme cela a été recommandé here mais il est encore dire que je suis seulement 256Mo, à s'écraser le même point. Des idées pour lesquelles je n'ai pas plus de mémoire? Il y a beaucoup de mémoire libre dans le système. Quand le moment viendra, je ferai quelques optimisations, mais pour le moment je veux utiliser les capacités complètes de mon appareil de test pour coder facilement. J'ai regardé divers articles, questions et l'une des deux actions mises en évidence a toujours résolu le problème. Je n'ai aucune idée de ce qui ne va pas dans mon code.

Edit:

ici est tout fichier manifeste

<?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

Il est câblé si votre application fonctionne correctement sur un périphérique de 2 Go mais pas sur un périphérique de 4 Go, et 'android: largeHeap =" true "' ne fonctionne pas pour votre problème? Pouvez-vous s'il vous plaît montrer le code de votre manifeste? –

+0

@ GraceFeng-MSFT J'ai édité la question avec le fichier manifeste. J'ai beaucoup de bitmaps que je dessine dans mon application et l'affichage est passé de HD à Quad HD, c'est la raison pour laquelle il y a plus d'utilisation de la mémoire. – hoacin

Répondre

1

L'attribut android:largeHeap="true" appartient à la balise application, s'il vous plaît vérifier le document officiel ici: application. Vous mettez cet attribut dans la balise manifest, cela devrait être la raison pour laquelle android:largeHeap="true" ne fonctionne pas pour votre application. Au fait, c'est peut-être hors sujet, puisque votre problème est causé par un grand bitmap, l'utilisation de la mémoire native (NDK & JNI) peut réellement contourner la limitation de taille de tas. Vous pouvez vérifier ce cas: JNI bitmap operations , for helping to avoid OOM when using large images.

+0

Cela a résolu le problème. Je pense que je vais supprimer plus tard toutes ces grandes ressources app-vie, votre lien semble être un bon endroit par où commencer. Je vous remercie! – hoacin