В следующем примере показано, что использование LRUCache ограниченного размера приводит к ошибке OutOfMemory при выделении нового пространства за пределами LRUCache.
Свойства: Размер процесса 64 МБ ; 10 МБ Размер LRUCache ; Фрагменты размером 1 МБ, которые я помещаю в LRUCache в цикле.
После 57 (64 МБ - 7 МБ) попыток я получаю:
05-15 09:05:51.385: E/AndroidRuntime(11630): FATAL EXCEPTION: main
05-15 09:05:51.385: E/AndroidRuntime(11630): java.lang.OutOfMemoryError
05-15 09:05:51.385: E/AndroidRuntime(11630): at com.example.testlrucachewithpathes.MyDataClass.<init>(MyDataClass.java:14)
После lrucache.evictall() кэш освобождается и снова появляется достаточно места для выделения. Но я думаю, что это не так.
Любые подсказки?
Вот мой код:
public class StartActivity extends Activity {
int iMegabyte=1000000;
LruCache<String, Object> nativelrucache=new LruCache<String, Object>(iMegabyte*10);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
// Do my stuff
Log.v("MEMORY STATE", getMemoryStatus());
// Case with MyDataClass ------------------------------------------------------------------------------------
for(int i=0;i<100;i++){
MyDataClass mdataclass=new MyDataClass(iMegabyte);
//lrucachemanager.put("ID_" + i, mdataclass);
Log.v("MEMORY STATE", "put data into cache : " + i);
nativelrucache.put("ID_" + i, mdataclass);
//nativelrucache.evictAll();
}
}
}
public class MyDataClass {
byte[] bytes;
public MyDataClass(int iSize){
//Arrays.fill( bytes, 0 );
bytes=new byte[iSize];
}
}