我的应用程序使用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);
}