最近碰上一个问题,用okhttp请求回来的数据在解析为java bean对象的时候出现了oom,直接上代码
org.json.JSONObject jsonData = new org.json.JSONObject(body);
String data = jsonData.getString("data");
List users = new Gson().fromJson(data, new TypeToken>() {}.getType());
报错出现在第一行,应为new操作申请内存导致oom;
于是好奇看了下一个网络请求回来解析为java bean到底要多大内存?
假设请求回来的数据大小为 a;那么需要多大的内存能完成数据解析的操作?
暂时修改后的代码
BaseResponseBean baseResponseBean =new Gson().fromJson(body,new TypeToken>>() {}.getType());
List users = baseResponseBean.getData();
这样比上面减少了一次new内存的操作;
记录一下,不知道改进后能不能解决问题。
贴上gson解析的两次new对象
public T fromJson(String json, Type typeOfT)throws JsonSyntaxException {
if (json ==null) {
return null;
}
StringReader reader =new StringReader(json);
T target = (T) fromJson(reader, typeOfT);
return target;
}
public T fromJson(Reader json, Type typeOfT)throws JsonIOException, JsonSyntaxException {
JsonReader jsonReader = newJsonReader(json);
T object = (T) fromJson(jsonReader, typeOfT);
assertFullConsumption(object, jsonReader);
return object;
}
综合上面 简单得出:okhttp里面一个 用gson解析需要2个 则需要3倍大小的数据内存才能得到数据bean;
那么如果数据量 接近最大内存的三分之一就会oom。