6
votes

Tas ne se développant pas sur l'émulateur de Genymotion

Tout en redimensionnant de gros bitmaps pour un téléchargement d'image plus rapide sur un serveur, j'ai occasionné de temps en temps dans des exemplaires. Pour éviter cela, je calcule la quantité de mémoire requise et vérifie si elle dépasse le runtime.getruntime (). MaxMemory () Avant d'essayer d'accroître une image.

Cependant, je rencontre toujours des erreurs OUM, même si l'image doit tenir compte de l'image tas facilement. p>

Le périphérique émulé (Galaxy Sii API 16) me donne une mémoire max de 67108864 octets à l'aide de la méthode ci-dessus. P>

Dans l'extrait suivant, la taille du tas est 43975K et Seulement

// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);


5 commentaires

Avez-vous résolu ce problème?


Malheureusement non. Des idées?


Non, je suis désolé que je traite toujours avec ça. Je vous ferai savoir si je trouve quelque chose d'utile.


Comment allouez-vous la mémoire, pouvez-vous publier un extrait de code


Ok, j'ai ajouté un extrait de code dans la question modifiée


3 Réponses :


1
votes

Vous avez un tas de 42 Mo, dont 14 Mo est déjà utilisé, 67% (28 m) est disponible gratuit / disponible xxx

Vous essayez d'allouer ~ 31m (pas 31k), qui est supérieur à 28 m qui est disponible, résultant en oom.

pour plus de détails sur l'interprétation Message de journal de la mémoire de la mémoire DALVIKVM Jetez un coup d'œil à la mémoire de débogage

Il y a beaucoup d'utilisation de la mémoire partagée en cours dans Android, pour calculer correctement l'utilisation de la mémoire de processus

Android meilleures pratiques sur la gestion de la mémoire bitmap efficace peut être utile < / p>


1 commentaires

42 Mo est la taille actuelle du tas, Runtime.getruntime (). MaxMemory () me donne 64 mégaoctes cependant. J'avais l'impression que je pourrais utiliser jusqu'à 64 mégaoctets et que le tas étendrait à cette taille. Le poste Stackoverflow est intéressant, mais cela ne répond pas vraiment à la question de savoir comment calculer de manière fiable la quantité de mémoire que je puisse allouer en toute sécurité.



1
votes

Une chose que vous pourriez essayer de modifier est build.props fichier de la ROM.

sur l'émulateur Genymotion Vous pouvez essayer d'exécuter ce qui suit via la coque racine: xxx

et il afficherait la ligne avec les paramètres DALVIK: xxx

et maxMemory est également signalé comme 268435456 octets sur le Emulator j'ai expérimenté.

Donc, vous pouvez essayer de jouer avec ce paramètre. En outre, assurez-vous que la mémoire allouée dans les paramètres de VirtualBox est compatible avec ces valeurs.


1 commentaires

Je ne suis en fait pas cela préoccupé par l'émulateur. Je me demandais simplement si la même chose pourrait arriver à des appareils de vrais utilisateurs, ce qui serait mauvais.



5
votes

Hors de la mémoire sur une allocation de 31961100-octet

Votre bitmap est de 32m. VM ne peut pas allouer de l'espace linéaire de 32 m pour stocker bitmap. Le tas est fragmenté, alors même si votre tas ait 32 m espace libre, il n'est pas toujours possible d'allouer un tel espace linéaire. Vous pouvez essayer de libérer autant de mémoire que vous pouvez et appelez GC avant de décoder le flux.

Essayez de décoder votre bitmap dans plus Voie efficace . ou traiter l'image dans les pièces . Si vous nous dites pourquoi vous avez besoin de cette image, nous pouvons vous dire comment le gérer.


7 commentaires

Je décodage déjà le bitmap avec une insuffisance> 1. Traitement de l'image en parties n'est probablement pas une option non plus - même si je pouvais l'enregistrer dans des pièces, je m'attendrais à ce qu'il y ait des artefacts lorsqu'il couture le reculez ensemble (corrigez-moi si j'ai tort). Ce que je fais actuellement, c'est échelle l'image jusqu'à une longueur maximale du côté de 1920px avant de le télécharger sur un serveur.


Existe-t-il un moyen de trouver l'espace contigu maximum disponible pour les allocations?


Non. Vérifiez cette réponse: Stackoverflow.com/Questtions/3331527/... Vous pouvez également créer un processus distinct pour scinder l'image là-bas, il aura la même taille de tas que pour le traitement de l'image. Essayez d'activer l'option userLargeDheap dans Manifest. Ou téléchargez l'image d'origine à l'aide de flux et d'échelle sur le côté serveur.


C'est malheureux, je vais peut-être essayer de créer un autre processus. Est-il prudent d'attraper un exemplaire et de télécharger le fichier directement dans ce cas?


Une autre pensée: Si j'exécute mon service dans un processus séparé, je m'attendais à ce que le tas ne soit pas fragmenté beaucoup initialement. Serait-ce une bonne idée d'allouer un grand bitmap et de la réutiliser pour toutes les images à l'aide de l'option InbitMap? Je sauvegarde chaque bitmap dans le fichier avant de traiter le prochain.


Vous feriez mieux de ne pas attraper OutofMemoryError et essayez de récupérer. Google ça, il y a beaucoup d'explications. Je ne vois aucun piège dans la réutilisation bitmap. Mais gardez à l'esprit que le processus séparé ne vous donnera pas 100% de garantie qu'il peut correspondre à votre image.


Ne fonctionne pas! J'ai essayé d'utiliser insécapacité et injustodécode en séquence pour obtenir le bitmap que je veux. Même avec une image de largeur de 1400px, elle frappe toujours une erreur de mémoire, émulateur proche inutilisable à cause de cela. Mais ça marche bien sur mon 1GB RAM Moto G Lollipop 5.0