ExecutorService удваивает память на уровне API ниже 26 - PullRequest
0 голосов
/ 02 июля 2018

Мое приложение загружает данные с 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);
}
...