我正在处理在创建一个非常大的JSONObject时生成的OutOfMemory异常,但从未被Android框架垃圾收集。在每次后续更新中,内存泄漏会变得越来越大,直到内存耗尽为止。我们有一个随时间变化的大型数据结构,每次更新时我们都会将整个数据结构发送到客户端并进行刷新。我知道这不是最好的方法,但仅仅为移动设备改变整个基础设施需要一些时间并且有说服力。
至于现在和当前,当一个Object超出Java范围时,应将其标记为可用于垃圾回收。我使用Eclipse MAT工具进行内存分析,根据工具,我从JSONObject解析的每个String都有一个返回原始JSONObject的链接。我有一个修复是我创建了一个删除函数,我遍历每个JSONObjects键并在完成解析后调用JSONObject.remove(key),它就像一个魅力并且收集了所有内存。但是,为什么我需要这样做?我不应该对超出范围的对象这样做。有什么想法吗?
提前致谢!
杰瑞德希恩答案 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。
祝你好运!