android内存使用和对象引用

时间:2014-02-16 15:30:48

标签: java android object memory-management reference

我确定在其他地方已经问过这个问题(或者类似的东西),但我找不到它,所以这是我的Android应用程序的(略微简化的)流程:

行动A: 解析json文件并将结果对象存储在List中(让我们称之为“raw”)。完成后,运行Activty B。

活动B: 搜索屏幕。按钮单击运行活动C

活动C: 根据活动B中的搜索参数过滤活动A中生成的列表。将过滤后的对象添加到另一个列表中(用于活动D - 让我们调用“过滤”)并根据其值创建另一个对象(用于活动E) - 让我们称之为bigObj)。以防万一bigObj的创建是相关的,比如我从这样的对象开始:

filtered = [{"name":"Dave", "age":"32", "job":"boss"},
{"name":"Dave", "age":"32", "job":"worker"},
{"name":"Dave", "age":"24", "job":"boss"},
{"name":"James", "age":"26", "job":"boss"},
{"name":"James", "age":"26", "job":"boss"},
{"name":"James", "age":"65", "job":"boss"}]

然后我最终得到一个像这样的对象:

   bigObj = {"Dave":{"32":[{"name":"Dave", "age":"32", "job":"boss"},
                {"name":"Dave", "age":"32", "job":"worker"}],
        "24":[{"name":"Dave", "age":"24", "job":"boss"}]
            },
        "James":{"26":[{"name":"James", "age":"26", "job":"boss"},
                {"name":"James", "age":"26", "job":"boss"}],
        "65":[{"name":"James", "age":"65", "job":"boss"}]
            }
}

所有这三个都通过应用程序活动的setter保存。

稍后,根据活动D或E中的用户交互,较小对象的内容(例如{"name":"Dave", "age":"32", "job":"boss"})会在活动F中显示给用户。

一切正常。但是有明显的重复。如果一个对象通过过滤器,它将出现在所有3个位置。由于对象包含的信息比活动D或E中实际需要的信息多得多,似乎有大量数据不必要地传递。这让我想到了我的问题:

假设“raw”中有100个对象,50个通过过滤器。现在有150个对象在内存中,或者是50个被放入“过滤”的对象只是对原件的引用?

因为另一种方法(看起来似乎)只是使用“过滤”来存储对象在“原始”中出现的索引(并从“原始”中检索实际对象)活动D)然后,当使“bigObj”制作新的“迷你对象”时,其中只包含活动E所需的信息 - 从上面的例子中可以看出名称和年龄值,加上对象在“原始”中的位置,然后可以用于检索活动F中的对象。

但是如果对象只是通过引用存储在“filtered”和“bigObj”中,那么制作一整套“迷你对象”实际上会产生反作用,最终会咀嚼到内存中而不是保存它。

感谢您的任何想法。我怀疑这个问题可能会被简单地问到,但我不知道知道什么是相关的,什么不是......

1 个答案:

答案 0 :(得分:1)

--- Android部分开始---
单个应用程序中的所有活动共享相同的虚拟内这意味着来自任何活动的任何数据都可以在没有任何限制的情况下用于任何其他活动 --- Android部分结束---

Java不会将对象保留在变量中。 Java中的对象变量类似于C ++中的对象变量 - 它是指向包含对象数据的内存的指针。

在仅通过值传递的方法的Java参数中。这意味着将复制任何原始变量,并将副本传递给方法。但是对象变量不是原始类型变量,因此方法将获得对象的引用副本,这意味着永远不会复制实际对象数据,直到您将其自己复制到新创建的对象。

Variables (The Java Tutorials > Learning the Java Language > Language Basics)