Je suis sur mon chemin avec la mise en œuvre d'un mécanisme de mise en cache pour mon application Android. p>
J'utilise Donc, chaque fois que je faites défiler le dos em> à une position antérieure (où j'ai déjà téléchargé des images auparavant), je dois télécharger les images une fois de nouveau - ils sont J'ai également étudié ce sujet. Selon Mark Murphy dans cet article , il semble qu'il y ait (ou était?) Un bug avec le Softreference code>, comme beaucoup d'exemples que j'ai trouvés. Le problème est que lorsque je fais défiler vers le haut ou le bas dans mon
listview code>, la
listview code> est parti. p>
Softreference code>. Certains autres résultats indiquent la même chose (ou le même résultat);
Softreference code> S est effacé trop tôt. P>
5 Réponses :
cache chaque image sur le stockage persistant au lieu de juste en mémoire. P>
Stockage persistant pour un cache transitoire? Droit. C'est une solution. Pour un autre problème.
Il n'est pas clairement clair que cela doit être un cache transitoire.
SOFTRÉGRATFE SONT LE CACHE DES MANS PAIVANTS. Le JVM peut contenir ces références vivantes plus longtemps, mais ne doit pas avoir à. Dès qu'il n'y a plus de référence difficile, la JVM peut détenir une collection d'un objet référencé doux. Le comportement de la JVM que vous rencontrez est correct, car le JVM n'a pas à tenir cet objet plus longtemps. Bien sûr, la plupart des JVM essaient de garder l'objet de référence doux en vie dans une certaine mesure. p>
Par conséquent, Softreferences est une sorte de cache dangereuse. Si vous voulez vraiment assurer un comportement en cache, vous avez besoin d'une vraie cache. Comme un Lru-cache . Surtout si votre mise en cache est critique de performance, vous devez utiliser un cache approprié. P>
Réponse claire! Merci! Je vais regarder dans le cache Lru et voir si c'est ce que je cherche. Mais pourquoi le JVM ne tient-t-il pas la référence douce "un peu plus longtemps"? Il y a en fait la mémoire restante ...
Parce que cela n'a pas besoin. Votre compréhension du contrat SR est incorrecte. GC ne "veulent pas" de reporter le nettoyage des SRS jusqu'à OUM Moment, car il peut simplement avoir le temps de le faire alors sans affecter les performances des applications.
Fonctionne comme un charme! Merci!
La réponse de Gamlor est correcte dans votre position de maîtrise. Toutefois, pour plus d'informations, voir GC FAQ , question 32. P>
Le serveur Java Hotspot Server utilise la taille maximale du tas possible (tel que défini par l'option -xmx) pour calculer l'espace libre restant. P>
Le client Java Hotspot VM utilise la taille du tas actuelle pour calculer l'espace libre. P>
Cela signifie que la tendance générale est que le serveur VM de cultiver le tas plutôt que de rincer les références douces, et -xmx a donc un effet significatif sur lorsque des références douces sont collectées. P> blockQuote>
Idéalement, Android garderait des références douces au moins pour un peu, mais cela prend au fait que vous avez utilisé une softrégencence pour signifier que cela ne vous dérange pas si ces données disparaissent et le suppriment essentiellement instantanément. Le JVM le fait correctement. Android mange essentiellement tout ce qu'il peut avec le collecteur des ordures. JVM FAQ est donc plus que non inutile le problème ci-dessus. La réponse à laquelle est essentiellement utiliser de fortes références.
du site d'entraînement Android: P>
http://developer.android.com/training/displaying-bitmaps/cache-bitmap .html p>
Dans le passé, une implémentation
Cache de mémoire populaire était une softreference forte> ou cache de bitmap d'affaiblissement, mais ce n'est pas recommandé. À partir de Android 2.3 (niveau 9 API 9) Le collecteur des ordures est plus agressif avec des références douces / faibles qui les font assez inefficace fort>. De plus, avant l'android 3.0 (niveau de l'API 11), Les données de support d'un bitmap ont été stockées dans une mémoire native qui n'est pas libéré de manière prévisible, provoquant potentiellement une application dépasser brièvement ses limites de mémoire et crash. p> blockQuote> Plus d'informations sur le lien. P>
Nous devons utiliser Lrucache à la place. P>
Merci! Je vais considérer que la prochaine fois!
JVM suit cette équation simple pour déterminer si une référence douce devrait être effacée: p>
intervalle <= free_heap * ms_per_mb p>
L'intervalle est la durée entre le dernier cycle GC Hyestamp et le dernier horodatage d'accès de référence mous. Le tas gratuit est un espace de tas disponible à ce moment-là. MS_PER_MB est des millisecondes allouées à chaque MB disponible en tas. (Constant de 1000 ms par défaut) p>
Si une équation ci-dessus est fausse, la référence est effacée. P>
Donc, même si vous avez beaucoup de mémoire libre, si vos références douces n'ont pas été accessibles pour une durée suffisante, elles seront effacées. P>
-XX: SOFTREFLRUPOLICYMSPERMB = JVM Arg peut être utilisé pour modifier MS_PER_MB Constante. P>
trop b> tôt? S'il y a un besoin de mémoire, il sera effacé. Qui a pour dire que c'est trop tôt? Si le système veut l'effacer, c'est ce que Softreference est ..
Correct. Mais il n'y a pas besoin de plus de mémoire, car je peux facilement respecter 50 images en mémoire. Mais afin d'éviter une erreur OOM, j'ai besoin d'utiliser ce mécanisme de mise en cache.
Je vous suggère de mettre en cache chaque image, de cette façon quand il est effacé, vous n'avez pas à le récupérer à partir du Web (sauf si cela n'existe pas dans le cache)
Eh bien, cela dépasse la déclaration réelle dans cette question. Je pense qu'un mécanisme de mise en cache sans économiser mes images devrait fonctionner, comme dans le code ci-dessus. Par conséquent, je demande si quelqu'un d'autre a résolu cette utilisation en utilisant cette technique.
@Viktor LANNÉR, je pense que vous répondez à votre propre question avec cela "afin d'éviter une erreur d'OOM, j'ai besoin d'utiliser ce mécanisme de mise en cache". Les références douces sont effacées à la discrétion de la GC et La seule garantie est qu'ils sont tous effacés avant qu'une erreur OOM soit lancée . Si vous voyez une erreur OOM sans références douces, il existe évidemment une pression de mémoire. Donc, le GC agit comme promis. Essayez de réduire la taille de vos images et / ou d'atténuer l'effet des références douces étant effacées en mettant également en cache sur le disque.
@RLIBBY: Eh bien, l'erreur OOM n'est pas encore apparue, alors je pense qu'il n'y a pas de "pression de mémoire". Depuis que j'ai vu d'autres réponses ici sur ce sujet (bien qu'il soit difficile de le comprendre), je pense qu'il existe une solution de travail sans mettre en cache ni réduire la taille de mes images.
J'ai eu la même expérience avec le cache de bricolage avec Softreferences. Ils ont été effacés pendant le temps de ralenti JVM, sans problème de mémoire urgente. Il n'y a pas de garantie SR sera maintenue juste avant l'OMM; GC peut plutôt les nettoyer dès qu'il croit raisonnable.
@road à Yambourg: Oui, je suis à peu près sûr que c'est comme ça.