【问题标题】:The cost of creating an object创建对象的成本
【发布时间】:2015-08-14 00:28:20
【问题描述】:

我正在考虑自己创建一个复杂的数据类型,但不确定它的成本。 假设,我有 3 个列表,姓名,年龄,性别, List<String> name = new ArrayList<String>; List<Integer> age = new ArrayList<Integer>; List<String> gender = new ArrayList<String>; 我想将这些列表的每个元素组合在一起,如下所示:

public class Person {
    private String name;
    private int age;
    private String gender;
    public void Person(String name,int age,String gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public void getName () {
    return name;
    }
    public void getAge () {
    return age;
    }
    public void getGender () {
    return gender;
    }
}

然后我可以创建包含这些信息的对象: Person person1 = new Person("John",22,"Male"); 但问题是名字列表太大了,可能有 1,000,000 个名字(还有年龄和性别列表),这意味着我需要创建 1,000,000 个 Person 对象。将包含姓名、年龄和性别的对象传递给另一个类是个好主意,还是我应该分别传递这些姓名、年龄和性别?

与将字符串名称、整数年龄和字符串性别相加的成本相比,包含姓名、年龄和性别的对象有多大?

【问题讨论】:

  • 您不应该一次将 100 万个对象加载到内存中。如果您这样做,您可能需要重新设计您的应用程序,因为充其量您会看到一些严重的性能问题。
  • 我会听从@forgivenson 的建议..
  • 正如@forgivenson 所说,您不应该一次在内存中加载一百万个对象,在您的情况下,您可能需要使用数据库来存储和检索对象。

标签: java


【解决方案1】:

不要做premature optimizations。最明确的方法是拥有一个 Person 对象列表。如果您实际上在这部分遇到性能问题,请考虑如何优化它。

关于对象的内存开销:

  • 每个对象本身has overhead of 8 bytes
  • 对象的字符串字段将占用与当前数组相同的大小
  • List<Integer> 4 字节 vs 4 + 16 字节 相比,对象的int 字段将占用更少的空间

因此,总而言之,如果您将列表分组为单个对象列表,您将在每条记录上节省 12 个字节

UPD由于alignment

,实际节省的可能是8个字节

【讨论】:

    【解决方案2】:

    如果你考虑一下,做一个 Person 列表而不是 3 个单独的列表会更有意义。如果您要创建 3 个列表,将它们放在一起会很复杂,并且您仍然会为每个字符串名称、整数年龄和字符串性别持有一个对象。

    所有人员的数组列表都会保存人员的引用,因此它的大小与仅在一个列表中的大小大致相同,以减少混乱,因为每个人都拥有与三个人完全相同的数据量列表加在一起。

    【讨论】:

    • 我明白了,我可以将姓名、年龄和性别组合成一个字符串,例如“John,22,Male”。然后我有一个字符串列表,而不是分别包含 "John",22,"Male" 的 Person 对象列表。
    • 这也可以,并且会比您之前提到的列表更小,只是我更喜欢分隔变量,因此我以后不必提取数据。
    【解决方案3】:

    您的原始代码已经分配了一个额外的对象 (Integer),因此更改为 Person 不会大大改变您的内存消耗,因为 age 是一个原始代码,而不是一个对象。

    您可以通过确保不分配大量重复字符串来压缩内存,具体取决于gender 的获取方式。如果它来自解析操作,您可能会为每个男性分配一个新的“男性”字符串。考虑将性别更改为Enum

    【讨论】:

      【解决方案4】:

      底线是,对于您的应用程序来说,这样的成本是微不足道的。

      每个 Java 对象都有 8 字节的开销来存储其对象类信息、GC 指标等。根据设计,Java 选择添加所有辅助信息以方便编程和调试而不是内存效率。因此,您正在创建一个具有此类开销和 3 个以上指针的对象,这在 64 位框上为您提供少于 8 + 3 * 8 个字节,即每个对象 32 个字节(大约)。即使在大型高性能系统中,这也不是问题,因为您已经选择了 Java 作为系统语言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2016-08-08
        • 2020-02-27
        • 1970-01-01
        • 2020-03-03
        相关资源
        最近更新 更多