Veuillez noter que je N'AI PAS de fuite de mémoire. Ma question concerne un problème plus subtil.
Récemment, j'ai écrit une application Android qui effectue du traitement d'image. L'image est chargée en tant que Bitmap, puis copiée en pixels, traitée de manière à utiliser beaucoup de mémoire (pensez aux transformations de Fourier en représentations en virgule flottante et autres), puis convertie de nouveau en bitmap et enregistrée.
Le problème est que, au moins jusqu'à Android OS 2.3, la limitation totale de mémoire (généralement 16 Mo) combine le java et les Bitmaps (stockés à l'extérieur), et la ligne de flottaison du java ne diminue pas (à ce que je puisse discerner) même lorsque la mémoire est libérée (avec succès GC'd), ce qui signifie que lorsque je vais allouer le Bitmap final, je suis souvent "sans mémoire" même si à ce stade j'ai libéré (et GC'd) la plupart de l'espace. En d'autres termes, je n'ai jamais besoin des 16 Mo complets en une fois, mais l'espace restant pour les Bitmaps semble être de 16 Mo moins l'utilisation historique MAX de la pile java (par opposition à l'utilisation actuelle).
J'ai regardé une présentation technique par l'un des développeurs Android sur les problèmes de mémoire et il a laissé entendre que ce problème a été corrigé dans les versions ultérieures du système d'exploitation (ils ont déplacé la mémoire Bitmap dans l'espace de la pile java), mais en attendant la plupart des personnes qui veulent utiliser mon application exécutent 2.2 ou 2.3.
En résumé, je me demande si la pile java est jamais compactée (défragmentée, en effet) de sorte que la ligne de flottaison diminue (et si c'est le cas, comment le faire arriver)?
Si ce n'est pas le cas, quelqu'un a-t-il une autre suggestion pour résoudre ce problème ?