Pertanyaan Ukuran LRU Cache sesuai kemampuan perangkat dan memori bebas


Saya sedang berpikir untuk mengimplementasikan lapisan pertama caching saya di aplikasi Android. Saya sedang mempertimbangkan SoftReferences untuk pasti menghindari pengecualian OOM, tetapi karena ada banyak artikel tentang bagaimana Android membebaskan ini "terlalu cepat", saya memutuskan untuk melihat ke cache android.util.LruCache.

Pertanyaan: Bagaimana saya mengukurnya dengan benar untuk perangkat yang sebenarnya? Itu semua terdengar sangat bagus bahwa cache LRU adalah solusi nyata dan bukan SoftReferences, tetapi jika Anda benar-benar ingin menghindari OOM Exceptions, rasanya sangat tidak aman untuk pergi dengan sejumlah megabyte referensi keras. Itu tidak aman jika kamu bertanya padaku. Bagaimanapun, ini sepertinya satu-satunya pilihan. Saya mencari GetMemoryClass untuk mengetahui ukuran aplikasi di perangkat yang sebenarnya (+ memeriksa ukuran heap gratis sebelum mengukur cache). Garis dasarnya adalah 16 Megs yang berbunyi Ok, tetapi saya telah melihat perangkat (G1 misalnya di masa lalu) melempar OOM pengecualian hanya sekitar 5 Megabytes ukuran heap (menurut Eclipse MAT). Saya tahu G1 sangat tua, tetapi intinya adalah bahwa pengalaman saya tidak benar-benar sesuai dengan garis dasar 16 Megs yang disebutkan dalam dokumentasi. Oleh karena itu saya benar-benar tidak yakin bagaimana saya harus meningkatkan cache LRU jika saya membutuhkan yang paling saya bisa dapatkan. (Akan senang dengan 8 Meg dan akan pergi dengan sekecil 1 Meg pada perangkat rendah-spec)

Terima kasih untuk semua petunjuk.

Sunting: Kelas cache Android LRU yang saya maksud: http://developer.android.com/reference/android/util/LruCache.html


12
2018-02-22 16:54


asal


Jawaban:


Saya pikir solusi yang valid untuk menghitung ukuran LruCache diuraikan dalam panduan dev:

int memClass = ( ( ActivityManager )context.getSystemService( Context.ACTIVITY_SERVICE ) ).getMemoryClass();
int cacheSize = 1024 * 1024 * memClass / 8;

Informasi lebih lanjut dapat ditemukan di sini: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html


14
2018-05-03 15:52



Dari pertanyaan Anda agak membingungkan untuk memahami apa yang Anda minta. Biarkan aku mencobanya.

Berbagai produk caching AppFabric, memcached, ncache dan scaleout memiliki batasan 1M per objek. Saya pikir skala tidak menawarkan beberapa jenis kustomisasi.

Tetapi semua ini adalah produk sisi server. Jadi untuk perangkat android, yang kemungkinan besar hanya berupa cache lokal host tunggal, saya mungkin akan menggunakan maksimal 64kb. Maksud saya, mengapa seseorang membutuhkan lebih dari 64kb per objek pada perangkat. Tebakan saya saja.

Jika saya adalah Anda, saya akan mempelajari memcached (solusi cache sumber terbuka paling terkenal). Dan mungkin skala karena mudah untuk mendapatkan dunia halo bekerja dengan skala keluar juga. Dan secara proporsional memutuskan.


0
2018-02-22 18:12