2010-11-18 5 views
3

Ma question peut sembler naïve mais je ne sais pas comment la formuler plus correctement. Le problème est que je crée et utilise de grands tableaux de type simple dans mon application. Et je reçois des erreurs comme:Pourquoi mon application a moins de mémoire de tas que d'autres?

ERROR/dalvikvm-heap(1763): Out of memory on a 7907344-byte allocation. 

Oui, il est assez grand, mais les outils de gestion des tâches prétendent que mon application utilise seulement 30 Mo de mémoire, tandis que d'autres à l'utilisation même temps 50Mo et même 110Mo (ont vu une fois) et il y a encore 190 Mo de mémoire libre dans le système (pas d'applications système, juste d'autres applications ordinaires que j'ai installées). Si toutes les applications sont fournies avec la même taille de tas au démarrage, comment peuvent-elles grandir si grandes?

+7

Peut-être un problème de trouver une potion de mémoire contiguë assez grande. – Anthony

+0

pourquoi voulez-vous allouer autant en premier lieu? Laisse-moi deviner: stream non bufferisé – apps

+0

Je l'utilise pour dessinerBitmap sur un Canvas. La raison en est que le bitmap est généré et constamment changé dans le code natif accédé par JNI. –

Répondre

4

La taille maximale du tas d'une application Android dépend du périphérique sur lequel elle s'exécute. Pour les premiers appareils, la taille maximale du segment était de 16 Mo, mais pour certains appareils plus récents, elle peut être de 24 Mo ou même de 32 Mo.

Ceci est une propriété de la machine virtuelle Dalvik sur chaque appareil et n'est pas quelque chose que vous pouvez changer (sans reconstruire Android à partir de la source).

Vous pouvez interroger la "classe de mémoire par application" avec ActivityManager.getMemoryClass() qui semble être un chiffre qui n'est pas totalement indépendant de la taille du tas.

Les applications peuvent utiliser de la mémoire qui n'est pas sur le tas mais 100 + Mo semble être une quantité étonnamment grande.

Si vous voulez en savoir plus sur l'analyse de l'utilisation de la mémoire sur Android, vous ne pouvez pas faire mieux que this Stack Overflow answer by Dianne Hackborn, qui est l'un des développeurs Android chez Google. En bref, il est dit que l'analyse de l'utilisation de la mémoire est très difficile et vous devriez prendre toutes les figures que vous avez avec une pincée de sel.

-1

Avez-vous essayé de configurer votre taille de tas? Utilisez les options suivantes pour le faire.

-Xms définir la taille de tas Java initiale -Xmx définir la taille de tas Java maximale

Pour obtenir plus d'aide run java -X

Exemple: java -Xms20m -xMX100m -cp. MyMain

Bonne chance.

-1

Nous savons tous que Java a par défaut le système de garbage collector mais à un certain niveau, nous devons effacer ou vider certains objets.

Et vous pouvez également définir ou configurer la taille de segment pour la machine virtuelle Java.