Мое приложение загружает данные с PHP-сервера, используя потоки из ExecutorService с размером ThreadPool 4. В API 27 приложение работает отлично, не вызывая никаких исключений OOM из памяти кучи. Но все предыдущие API <26 выдают OOM. </p>
Ниже приведен простой пример кода, который выполняет 134 запроса, а затем добавляет ответ в пул. В API 27 максимальный размер кучи достигает 68 МБ. Но когда я запускаю его с API 19,21,25 e.t.c, максимальный размер кучи достигает 123 мегабайт.
Когда я удаляю Log.d («Ответ процесса», (ответ) + «»); в API 27 размер кучи уменьшается до 10 МБ. Но с API 19 размер кучи достигает 60 МБ.
Я не могу понять, почему он удваивает размер. Похоже, что в API 19 и выше увеличивается объем памяти при добавлении задач в пул, а также при удерживании ссылки в переменной ответа.
Есть предложения?
Примечание
Спящий поток предназначен только для примера, чтобы увидеть максимальный размер кучи
Спасибо
private ActivityManager activityManager;
ExecutorService service = Executors.newFixedThreadPool(4);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activityManager= (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);;
final RequestQueue queue = Volley.newRequestQueue(this);
String url =".....";
for(int i =0 ; i<134 ; i++) {
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
method(response); //0.5mb
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VolleyError", error.toString());
}
});
queue.add(stringRequest);
}
}
public void method(final String response){
Runnable task = new Runnable() {
@Override
public void run() {
try {
Log.d("Process response", (response)+"");
Thread.sleep(200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
logHeap("");
service.execute(task);
}