Google Maps API Android v2 SupportMapFragment fuite de mémoire
À l'aide de 2 activités simples. Première Activité qui ne tient que sur un bouton pour démarrer la 2ème Activité qui est titulaire de la carte:
Activité Principale:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goToMap(View view){ //This is just the onClick method for the button
Intent intent=new Intent( this, BigMapTest.class);
startActivity(intent);
}
L'activité sur la carte:
public class BigMapTest extends FragmentActivity {
SupportMapFragment mapFragment;
GoogleMap map;
@Override
protected void onCreate(Bundle arg0) {
//TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.travel_diary_big_map);
mapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.big_map);
map=mapFragment.getMap();
}
Le XML Mise en page de la carte d'activité:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/big_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment"
/>
Maintenant lorsque j'exécute ce code, appuyez sur le bouton pour passer à l'Activité avec la carte, et en appuyant sur la touche back pour se rendre à la première activité...puis en répétant le processus, je peux voir le tas de l'augmentation de la taille à chaque fois, jusqu'à ce qu'il atteint ses limites, et puis il commence de serrage. Si vous gâcher un peu plus avec la carte(c'est à dire le zoom), je peux avoir une OOM Exception à ce point.
01-25 16:10:13.931: D/dalvikvm(21578): GC_FOR_ALLOC libéré 1898K, 7% gratuit 45859K/49187K, pause 204ms
01-25 16:10:14.671: I/dalvikvm-tas(21578): Pince cible GC tas de 52.724 MO à 48.000 MO
01-25 16:10:14.671: D/dalvikvm(21578): GC_CONCURRENT libéré 2534K, 6% gratuit 46554K/49187K, pause 3ms+14ms
01-25 16:10:15.372: I/dalvikvm-tas(21578): Pince cible GC tas de 52.979 MO à 48.000 MO
01-25 16:10:15.382: D/dalvikvm(21578): GC_CONCURRENT libéré 2273K, 5% gratuit 46815K/49187K, pause 3ms+15ms
01-25 16:10:15.622: I/dalvikvm-tas(21578): Pince cible GC tas de 52.604 MO à 48.000 MO
01-25 16:10:15.622: D/dalvikvm(21578): GC_FOR_ALLOC libéré 657K, 6% gratuit 46431K/49187K, pause 202ms
01-25 16:10:16.203: I/dalvikvm-tas(21578): Pince cible GC tas de 52.959 MO à 48.000 MO
01-25 16:10:16.203: D/dalvikvm(21578): GC_FOR_ALLOC libéré 1469K, 5% gratuit 46796K/49187K, pause 217ms
01-25 16:10:16.203: I/dalvikvm-tas(21578): Forcer la collection de SoftReferences pour 278744-allocation d'octets
01-25 16:10:16.423: I/dalvikvm-tas(21578): Pince cible GC tas de 52.952 MO à 48.000 MO
01-25 16:10:16.423: D/dalvikvm(21578): GC_BEFORE_OOM libéré 9K, 5% gratuit 46786K/49187K, pause 219ms
01-25 16:10:16.423: E/dalvikvm-tas(21578): de mémoire sur un 278744-allocation d'octets.
Des suggestions/aide serait appréciée.
- Utilisation de TAPIS de sol pour déterminer la source de votre fuite.
- À l'aide de TAPIS et alors la recherche de l'objet avec la plus grande retenue de la taille (qui ne cesse de grandir à chaque cycle) puis en utilisant le chemin d'accès à la GC racines à l'exclusion des références faibles, j'ai atteint les suivants: cartes de la classe.par.un @ 0x414f7fa8 Système de Classe. - Mais je ne sais pas quoi faire ensuite.
- Il semble que quelque chose est accumilating dans une table de hachage: La classe "des cartes.par.une", chargé par "dalvik.système.PathClassLoader @ 0x413de740", occupe 12,923,112 (57.78%) octets. La mémoire est accumulé dans une instance de java.util.HashMap$HashMapEntry[]" chargé par "<système de chargeur de classe>". Mots-clés java.util.HashMap$HashMapEntry[] cartes.par.un dalvik.système.PathClassLoader @ 0x413de740
- Eh bien, ce n'est pas prometteuse. Ai-je une chance peut con vous dans le téléchargement de l'ensemble du projet de test quelque part afin que je puisse prendre un coup d'oeil?
- Assurez-vous. Bien que je suis très nouveau à ce...Où serait-il approprié de la charge de trop? (Si le projet est très petite, comme décrit ci-dessus)
- Dépôt GitHub, le fichier ZIP sur le public de DropBox, le fichier ZIP sur Amazon S3, ...
- dl.dropbox.com/u/83195107/MapMemoryLeakTest.zip
- OK, je vais jeter un oeil à ce cours du week-end et de faire rapport des résultats.
- Je vous remercie beaucoup.
- Google ont reconnu ce problème et a déclaré que cela sera corrigé avec la prochaine version de Maps API Android. code.google.com/p/gmaps-api-issues/issues/detail?id=4766
- Question est - à quand la prochaine sortie?
Vous devez vous connecter pour publier un commentaire.
Près que je peux dire de certains basic TAPIS de détective, ce que vous voyez est un cache géré par les Cartes V2 de téléchargé des données cartographiques. Le cache semble être plus grand si vous pan et zoom beaucoup. Le cache se rétrécit si vous laissez la carte et revenir à une nouvelle carte plus tard. Je ne pouvais pas obtenir N caches de N fois le lancement de l'activité sur la carte de votre exemple d'application, et la taille du cache est propagée par vagues selon ce que l'utilisateur fait.
Hélas, ce cache est unconfigurable, autant que je sache, en termes de comment elle est grande, quand il est effacée, ne il des répercussions sur le disque, etc.
Donc, par défaut, tout ce que vous pouvez faire est de laisser de côté une bonne partie de votre espace de tas de Cartes V2 pour jouer avec, et de prendre des mesures pour rester dans ce petit sous-ensemble de tas.
Si vous voulais expérimenter, vous pouvez essayer d'appeler
clear()
surGoogleMap
, ouonLowMemory()
sur votreSupportMapFragment
, pour voir si tout servir à réduire la taille de la mémoire cache.À compter du 26 février 2013, cette question, qui est également décrite sur la gmaps-api-les enjeux de la page a été résolu par le courant Google API mise à Jour.
J'ai exactement le même problème. La mémoire est accrue à chaque fois que l'activité d'hébergement de la V2 carte commence. Et il n'est pas libéré, même lorsque l'activité de fin.
Donc la solution de contournement est de réutiliser cette activité. Faire de l'activité
singleTask
dans le manifeste, et au lieu definish()
, utilisezmoveTaskToBack(true);
L'utiliser dans votre mise en page:
Et ce code: