Le compactage du tas est l'une des caractéristiques du runtime ART d'Android 5.0+, qui vise à réduire la fragmentation du tas. Un tas fragmenté peut devenir OutOfMemoryErrors
Il est en effet possible qu'il n'y ait pas un seul bloc de mémoire libre contigu suffisamment grand pour répondre à vos besoins, même si le tas dispose globalement de suffisamment d'espace libre.
Je crois savoir que cela se produit lorsque l'application passe en arrière-plan, d'après les présentations des conférences de Google et autres. Cependant, la seule déclaration que je peux trouver à ce sujet dans la documentation dit :
Le compactage d'espace homogène est un compactage d'espace de liste libre à espace de liste libre qui se produit généralement lorsqu'une application est déplacée vers un état de processus imperceptible en pause. Les principales raisons de cette opération sont la réduction de l'utilisation de la RAM et la défragmentation du tas.
On ne sait pas exactement ce que signifie, techniquement, un "état de processus imperceptible en pause".
Supposons qu'une application n'a pas d'activité au premier plan pour le moment. Le développeur aurait-il pu faire quelque chose pour empêcher le compactage du tas pour le processus de cette application ? Par exemple, le fait d'avoir un service au premier plan bloque-t-il le compactage du tas ?