2010-01-25 5 views
15

Je reçois une erreur «taille de bitmap dépasse le budget VM». J'ai lu qu'il y a une limite de mémoire de 16 Mo. In this thread Romain Guy dit que "vous ne pouvez allouer que 16 Mo de mémoire pour l'ensemble de votre application".Allocation de mémoire Android

Toutefois, mon application doit être à court de mémoire longtemps avant d'atteindre cette limite. Donc ma question est: comment puis-je allouer de la mémoire à mon application ... comment puis-je augmenter l'allocation à mon application (dans les 16 Mo maximum)?

+24

bien 640KB shold être suffisant pour quoi que ce soit google tout simplement généreux ... – Gu1234

Répondre

36

Comme pour toute machine virtuelle Java, la mémoire de segment passe automatiquement à la taille maximale. Mais, les bitmaps sont alloués en dehors de la machine virtuelle, de sorte que vous ne les "voyez" pas facilement dans les statistiques. La meilleure chose que vous pouvez faire est assurez-vous de ne pas utiliser de grandes bitmaps, ou de les réduire en utilisant
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

De Eclipse vous pouvez générer un vidage de tas lorsque vous êtes sur Android 1.6 ou et vous pouvez analyser les vidage avec Eclipse MAT.

Généralement, vous ne pouvez pas contrôler la taille maximale du tas sur un périphérique réel, sauf si vous travaillez avec du matériel ou un microprogramme personnalisé.

Il devrait y avoir un article à developer.android.com sur le dumping du tas sur 1.6, mais je suis incapable de le trouver. :(

Modifier
En outre, je dois mentionner que vous pouvez demander plus de mémoire pour les applications en utilisant

android: largeHeap = "true"

dans le manifeste. Mais cela est très mal conseillé car la plupart des applications n'en ont pas besoin

+0

Merci. Je jetterai un coup d'oeil aux décharges de tas et à MAT quand j'aurai le temps. – prepbgg

+1

Je viens de remarquer que vous avez dit que je pouvais obtenir un vidage de tas et utiliser Eclipse MAT sur Android 1.6. Malheureusement, mon appareil est sur 1.5, c'est pour ça que je suis en train de programmer. Y at-il un moyen facile d'obtenir une analyse de la mémoire pour 1,5? Le tableau d'utilisation de la mémoire dans SysInfo dans DDMS montre une légère augmentation de l'utilisation à chaque rotation d'écran; Inclut-il la mémoire non-heap utilisée par bitmaps? Le DDMS Allocation Tracker ne montre aucune utilisation significative de la mémoire (en supposant que ses unités sont des octets); Y a-t-il des objets autres que des bitmaps qui n'apparaîtraient pas dans le DDMS Allocation Tracker? – prepbgg

+1

Vous pouvez exécuter votre code dans l'émulateur 1.6 pour le débogage, ou vous pouvez essayer la procédure décrite ici http://biowallet.blogspot.com/2009/04/analyze-android-15-memory-dump.html ou vous pouvez utilisez l'API à http://developer.android.com/reference/android/os/Debug.html#dumpHprofData%28java.lang.String%29 pour vider le tas de votre application à un endroit où vous le souhaitez. – botteaap

11

Notez que la limite du tas dépend de l'appareil. La limite t est de 24 Mo (pour prendre en charge les ressources graphiques les plus importantes.)

+0

Nexus S a également 24 Mo, il semble que la plupart des périphériques haut de gamme auront plus de 16 Mo, mais si vous voulez courir sur n'importe quel appareil, vous devriez le garder sous 16 Mo. – ddcruver

+8

Non, Nexus S a 32 Mo sur 2.3. –

+1

Comment puis-je connaître la limite de tas de mon périphérique? –

6

Si vous utilisez des threads, le débogueur est peut-être à l'origine du problème. Si vous exécutez l'application sous le débogueur, tous les threads créés seront conservés par le débogueur, même s'ils sont terminés. Cela entraîne des erreurs de mémoire qui ne se produisent pas lorsque l'application est exécutée sans le débogueur.

http://code.google.com/p/android/issues/detail?id=7979

https://android.googlesource.com/platform/dalvik/+/master/docs/debugger.html

+0

Merci pour ça. Je me suis demandé si l'utilisation du débogueur pouvait causer des problèmes de mémoire qui ne se produiraient pas autrement. C'est bon de l'avoir confirmé. – prepbgg

+1

Je suppose que c'est le contraire d'un heisenbug ... – snapfractalpop

-1

J'ai trouvé la réponse à votre question récemment.

Aller à Android SDK Directory et
run manager sdk (Outils-> Exécuter Android ce fichier)

Dans le Gestionnaire SDK allez dans Outils -> Gérer AVDS

maintenant Virtual Device Android boîte de dialogue Manager est ouvert..

dans cette fenêtre, sélectionnez votre AVD et cliquez sur Modifier

maintenant dans la section carte SD sélectionnez SIZE et définissez 1024 MiB dans la section Hardware cliquez sur Nouveau et sélectionnez la propriété « Taille de tas d'application maximale VM » maintenant situé à 100 (sur la base sur votre condition d'application) Enfin cliquez sur « Modifier AVD »

après le contrôle cliquez sur le bouton Actualiser sur sdk Gestionnaire

maintenant, lancez votre application dans AVD votre problème est résolu.

+3

Cela ne fonctionne que pour l'émulateur, pas pour un vrai périphérique. – botteaap

+0

..et a vraiment peu (presque rien) à faire avec la mémoire disponible pour votre application et la réduction des bitmaps de mémoire utilisent .. – Ewoks