我正在处理一个 OutOfMemory 异常,该异常是在创建了一个非常大的 JSONObject 但从未被 Android 框架收集为垃圾时生成的。在随后的每次更新中,内存泄漏变得越来越大,直到我用完内存。我们有一个随时间变化的大型数据结构,每次更新时,我们都会将整个数据结构发送给客户端并刷新它。我知道这不是最好的方法,但是仅仅为了移动而改变整个基础设施将需要一些时间和说服力。
至于此时此地,当一个对象超出 Java 的范围时,它应该被标记为可用于垃圾收集。我正在使用 Eclipse MAT 工具进行内存分析,根据该工具,我从 JSONObject 中解析出的每个字符串都有一个返回原始 JSONObject 的链接。我的一个修复是我创建了一个删除函数,我在其中遍历每个 JSONObjects 键并在完成解析后调用 JSONObject.remove(key) ,这就像一个魅力并且收集了所有内存。但是,为什么我需要这样做?我不应该对超出范围的对象这样做。有什么想法吗?
提前致谢!
贾里德希恩
最佳答案
也许最好在收到 JSON 响应后立即将其转换为 POJO。 Jackson JSON 解析器将通过两行代码为您完成此操作,如果您需要这样做,还可以将其转换回您的 JSON 对象。
Jackson 非常快(他们声称是所有解析器中最快的),因此您不会对性能造成太大影响。
查看 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。
祝你好运!
关于android - 为什么Android的JSONObject会保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201461/