我想问下这是什么原因造成的内存溢出

图片说明

JsonReader 流沒有關閉的話,一直打開open操作就會導致內存溢出,
以前項目遇到過這種情況。

http://outofmemory.cn/c/java-outOfMemoryError

集合数据太大了吧 数据量较多的时候复制用System.arraycopy()

SpringBuffer后面添加数据 的时候数值限制有问题吧

这应该是有死循环,把代码贴出来

![![![图片说明](https://img-ask.csdn.net/upload/201804/02/1522636939_731883.png)图片说明](https://img-ask.csdn.net/upload/201804/02/1522636929_583538.png)图片说明](https://img-ask.csdn.net/upload/201804/02/1522636923_48821.png)图片说明
这是这个累的所有代码

/**

  • Json解析工具
    */
    public class ResponseUtils {

    private Gson gson = new GsonBuilder()
    .setLenient()
    .registerTypeAdapter(BaseAlertEntity.class,new BaseAlertModuleAdapter())
    .create();
    private JsonObject jsonObject;
    private String jsonStr;

    public boolean isSuccess() {
    if (jsonObject == null || jsonObject.get("success") == null) {
    return false;
    }
    return jsonObject.get("success").getAsBoolean();
    }

    public ResponseUtils(String jsonStr) {
    super();
    this.jsonStr = jsonStr;
    String trimJsonStr = "";
    if (jsonStr != null) {
    trimJsonStr = jsonStr.trim();
    }
    JsonReader reader = new JsonReader(new StringReader(trimJsonStr));
    reader.setLenient(true);
    try {
    jsonObject = gson.fromJson(reader, JsonObject.class);
    } catch (Exception e) {
    e.printStackTrace();
    jsonObject = null;
    }
    }

    public boolean isExipired() {
    if (jsonObject == null || jsonObject.get("code") == null) {
    return true;
    }
    return jsonObject.get("code").getAsInt() == 600;
    }

    public int getResponseCode() {
    return jsonObject.get("code").getAsInt();
    }

    public T onFailedModel(Class faild) {
    if (jsonObject == null || jsonObject.get("result") == null) {
    return null;
    }
    JsonReader reader = new JsonReader(new StringReader(jsonObject.get("result").toString()));
    reader.setLenient(true);
    try {
    return gson.fromJson(reader, faild);
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }

    /**

    • 不是数组的泛型 */ public T onSuccessModel(Class success) { if (jsonObject == null || jsonObject.get("result") == null) { return null; } JsonReader reader = new JsonReader(new StringReader(jsonObject.get("result").toString())); reader.setLenient(true); try { return gson.fromJson(reader, success); } catch (Exception e) { e.printStackTrace(); return null; } }

    /**

    • 带数组的泛型 */ public T onSuccessModel(Type typeOfT) { if (jsonObject == null || jsonObject.get("result") == null) { return null; } JsonReader reader = new JsonReader(new StringReader(jsonObject.get("result").toString())); reader.setLenient(true); try { return gson.fromJson(reader, typeOfT); } catch (Exception e) { e.printStackTrace(); Log.e("JsonFormatError", jsonObject.get("result").toString()); return null; } }

    /**

    • Deserialize a json to a arrayList */ public ArrayList deserializeToList(Class clazz) { if (jsonObject == null || jsonObject.get("result") == null) { return null; } JsonReader reader = new JsonReader(new StringReader(jsonObject.get("result").toString())); reader.setLenient(true); try { Type type = new ListParameterizedType(clazz); return gson.fromJson(reader, type); } catch (Exception e) { e.printStackTrace(); Log.e("JsonFormatError", jsonObject.get("result").toString()); return null; } }

    public ArrayList deserializeToList(Class clazz,String json) {
    JsonReader reader = new JsonReader(new StringReader(json));
    reader.setLenient(true);
    try {
    Type type = new ListParameterizedType(clazz);
    return gson.fromJson(reader, type);
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }

}

好像是JsonReader 流没有关闭

推荐你用Eclipse Memory Analyzer,这个插件可以查看到底是哪里出了问题。