Je vais avoir un dépassement de mémoire exception avec une galerie de plus de 600 x 800 pixels JPEG.
L'environnement
J'ai été en utilisant la Galerie avec des images JPG autour de 600 x 800 pixels.
Depuis mon contenu peut être un peu plus complexe que de simples images, j'ai mis chaque point de vue est un RelativeLayout qui encapsule ImageView avec le JPG.
Pour "accélérer" l'expérience de l'utilisateur, j'ai un simple cache de 4 emplacements prélectures (en fonction de lecture en boucle) sur 1 image à gauche et 1 droit à l'image de l'image affichée et les maintient dans un logement 4 HashMap.
La plate-forme
Je suis à l'aide de l'AVD de 256 de RAM et 128 de la Taille du Segment, avec une 600 x 800 écran. Il arrive aussi sur un Entourage Bord de la cible, sauf qu'avec l'appareil, il est plus difficile à déboguer.
Le problème
J'ai été faire une exception:
OutofMemoryError: bitmap size exceeds VM budget
Et il se produit lors de l'extraction de la cinquième image. J'ai essayé de changer la taille de mon image cache, et c'est toujours le même.
La chose étrange: Il ne devrait pas être un problème de mémoire
Afin de s'assurer le tas limite est très loin de ce dont j'ai besoin, j'ai défini un mannequin 8MB tableau dans le début, et c'est parti non référencé, donc il est immédiatement envoyé. Il est membre de l'activité de filetage et est définie comme suit
static { @SuppressWarnings("unused")
byte dummy[] = new byte[ 8*1024*1024 ]; }
Le résultat est que la taille du segment de mémoire est près de 11MO et tout ça, gratuitement. Notez que j'ai ajouté cette astuce après il a commencé à se bloquer. Il fait OutOfMemory de moins en moins fréquentes.
Maintenant, je suis à l'aide de DDMS. Juste avant le crash (ne change pas beaucoup après le crash), DDMS montre:
ID Heap Size Allocated Free %Used #Objects
1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156
Et, dans le détail, le tableau il montre:
Type Count Total Size Smallest Largest Median Average
free 1,536 8.739MB 16B 7.750MB 24B 5.825KB
Le bloc le plus important est de 7,7 MO. Et pourtant, le LogCat dit:
ERROR/dalvikvm-heap(1923): 925200-byte external allocation too large for this process.
Si vous avez l'esprit le rapport de la médiane et de la moyenne, il est plausible de supposer que la plupart des blocs sont très petites. Cependant, il y a un bloc assez grand pour l'image, c'est de 7,7 M. Comment se fait il est pas encore assez?
Note: j'ai enregistré un tas de trace. Lorsque l'on regarde la quantité de données alloué, il ne se sent pas plus de 2M est alloué. Il ne correspond pas à la libérer de la mémoire par rapport DDMS.
- Se pourrait-il que j'ai de problème comme des tas de fragmentation?
- Comment puis-je résoudre/solution de contournement du problème?
- Est le segment de mémoire partagée à tous les threads?
- Pourrait-il être que j'interprète les DDMS de lecture dans un mauvais chemin, et il n'y a vraiment pas de 900K bloc à allouer? Si oui, quelqu'un peut-il me dire où je peux voir ça?
Merci beaucoup
Meymann