ExecutorService将API级别低于26的内存加倍

时间:2018-07-02 09:59:35

标签: android multithreading android-memory

我的应用程序使用ThreadPool大小为4的ExecutorService中的线程从PHP Server下载数据。在API 27中,该应用程序完美运行,而不会导致Heap内存出现任何OOM异常。但是所有以前的API <26都抛出OOM。

下面是一个简单的代码示例,该示例执行134个请求,然后将响应添加到池中。在API 27中,最大堆大小达到68 mb。但是当我使用API​​ 19,21,25 e.t.c运行它时,最大堆大小达到123 mb。

当我删除Log.d(“ Process response”,(response)+“”);在API 27中,堆大小降低到10mb。但是使用API​​ 19,堆大小将达到60mb。

我不明白为什么尺寸会加倍。在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);
}

0 个答案:

没有答案