为什么Android的JSONObject会保留在内存中?

时间:2011-06-01 12:54:50

标签: android json out-of-memory

我正在处理在创建一个非常大的JSONObject时生成的OutOfMemory异常,但从未被Android框架垃圾收集。在每次后续更新中,内存泄漏会变得越来越大,直到内存耗尽为止。我们有一个随时间变化的大型数据结构,每次更新时我们都会将整个数据结构发送到客户端并进行刷新。我知道这不是最好的方法,但仅仅为移动设备改变整个基础设施需要一些时间并且有说服力。

至于现在和当前,当一个Object超出Java范围时,应将其标记为可用于垃圾回收。我使用Eclipse MAT工具进行内存分析,根据工具,我从JSONObject解析的每个String都有一个返回原始JSONObject的链接。我有一个修复是我创建了一个删除函数,我遍历每个JSONObjects键并在完成解析后调用JSONObject.remove(key),它就像一个魅力并且收集了所有内存。但是,为什么我需要这样做?我不应该对超出范围的对象这样做。有什么想法吗?

提前致谢!

杰瑞德希恩

1 个答案:

答案 0 :(得分:2)

也许最好在收到JSON响应时将其转换为POJO。 Jackson JSON解析器将在两行代码中为您完成,如果您需要,还可以将其转换回JSON对象。

杰克逊非常快(他们声称所有解析器中速度最快)所以你不会在性能上受到太大影响。

在他们的网站上查看this教程。

从教程中,您可以使用这个简单的JSON对象:

{
    "name":
    {
        "first":"Joe",
        "last":"Sixpack"
    },
    "gender":"MALE",
    "verified":false,
    "userImage":"Rm9vYmFyIQ=="
}

并使用以下代码将其解析为您自己的对象:

ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
User user = mapper.readValue(new File("user.json"), User.class);

您也知道,我在最近的Android项目中也存在内存保留问题,最终放弃了使用JSON。

祝你好运!