Middle
Kas sa tead, kuidas vahemälukaart töötab?
sobes.tech AI
Vastus AI-lt
Memory Cache (Mälu vahemälu) Androidis — see on mehhanism andmete salvestamiseks seadme operatiivmälu, et pakkuda kiiret juurdepääsu. See põhineb assotsiatiivse vahemälu põhimõtetel.
Kuidas see töötab:
- Andmete päring: Kui rakendus küsib andmeid, mis võivad olla vahemälus (näiteks pilt võrgust või keerulise operatsiooni tulemus), kontrollib see esmalt vahemälu.
- Otsing vahemälus: Kui andmed leiti vahemälust (st. päringu võti vastab vahemälu võtmele), tagastatakse need kohe, vältides aeglasi sisendi-väljundi operatsioone või arvutusi. Seda nimetatakse "cache hit".
- Vahemälu puudumine (Cache Miss): Kui andmeid ei leitud vahemälust ("cache miss"), saab rakendus need algsest allikast (võrk, andmebaas jne).
- Andmete salvestamine vahemällu: Pärast saamist salvestatakse andmed vahemällu tulevasteks päringuteks sama võtmega.
- Väljutamine (Cache Eviction): Vahemälu on piiratud suurusega. Kui see täitub, eemaldatakse vanad või vähem kasutatud elemendid, et teha ruumi uutele. Levinud väljutamise algoritmid on — LRU (Vähem hiljuti kasutatud) ja LFU (Vähem sageli kasutatud).
Näide Androidis LruCache kasutades:
// Maksimaalse suurusega `LruCache` loomine
private LruCache<String, Bitmap> memoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Maksimaalne juurdepääsetav mälu suurus (KB)
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// Kasutame 1/8 juurdepääsetavast mälust vahemäluks
final int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// Meetod iga elemendi suuruse arvutamiseks vahemälus,
// vastavalt vahemälu suurusele (siin — KB)
return bitmap.getByteCount() / 1024;
}
};
}
// Elemendi lisamine vahemällu
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
// Elemendi saamine vahemälust
public Bitmap getBitmapFromMemCache(String key) {
return memoryCache.get(key);
}