【问题标题】:Objects memory management in Java on AndroidAndroid 上 Java 中的对象内存管理
【发布时间】:2018-02-09 09:19:22
【问题描述】:

如果我有:

  • 包含List<B> 的对象 A
  • 我的List<B> 中包含List<C> 的所有对象B
  • 我的List<C> 中包含List<D> 的所有对象C 等等……

内存是如何管理的?当对象 A 被实例化时,所有“链接”对象(B、C、D...)都会被实例化并放入内存中?

【问题讨论】:

    标签: java android memory-management


    【解决方案1】:

    每次调用new() 时,都会从堆中取出相应对象所需的内存。

    正如您通常开始创建一个空列表 - 只请求该事物所需的内存。

    换句话说:没有办法一次性创建“完整”的结构。如果你这样做没有区别:

    List<List<String>> strings = new ArrayList<>();
    

    或

    List<Number> numbers = new ArrayList<>();
    

    在堆上分配的内存量对于这两条指令相同!因为在 both 情况下会创建 一个 新对象(即 ArrayList 实例)。

    【讨论】:

    • 仅作记录:当然,new A() 可能会导致其他对象的创建(例如当 A 有一些字段,而 A 的构造函数自己创建新对象时)。
    • 实际上,我只是在使用带有多个包含关系甚至一些循环关系的表的 ORM 时问自己这个问题。我认为它可能会很快变成大量内存负载,但我想在这种特定情况下,这取决于 ORM 的实现方式......
    • 正确。实际上有许多不同的方面在这里发挥作用。在那个层面上不可能有一个通用的答案——所以你能够以某种方式把它变成一个“好的”问题是件好事;-)
    • 实际上,当我问这个问题时,我专注于我的 ORM 问题,只是试图概括这个问题......我只是没有意识到,当我概括它时,它变成了一种 Java 编程基础问题,直到我得到这些反对票并看到你的答案......但实际上,如果你看得更深,这并不那么明显......而且在堆栈溢出时很难找到这个问题,所以......在这里很有用:)再次感谢你你的时间。
    • 如前所述:要了解某些 ORM 工具在做什么 - 你需要知道 A) 什么工具 B) 什么数据 C) 什么样的“交互”
    【解决方案2】:

    语句List&lt;String&gt; strings = new ArrayList&lt;&gt;(); 只为列表本身分配堆空间,列表只存储对其包含的对象的引用,不包含对象本身。

    请注意,ArrayList 使用数组作为其内部结构(您可能已经猜到了),因此构造函数基本上分配了一个初始大小的数组。为了创建巨大的 ArrayList,您应该预先分配空间以提高效率,例如List&lt;String&gt; strings = new ArrayList&lt;&gt;(2000); 为 2000 个字符串引用预分配空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多