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

标签 android json out-of-memory

我正在处理一个 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/

相关文章:

android - 无法触发 onActivityResult() android?

android - iOS - Swift - 手机插入时的回调

android - 每次我尝试导出签名的 apk 时,ADT 都会排除一堆类

c# - 有什么方法可以更改 JSON 中的日期时间格式吗?

android通知不会触发BroadcastReceiver onReceive

c# - 获取 (415) 不支持的媒体类型错误

php - Symfony表单错误呈现

C++ 指针数组内存分配与普通数组

go - 解析 Freebase RDF 时 golang 内存不足

java.lang.OutOfMemoryError : Java heap space in Maven