Java pointer/reference 内存开销
Java pointer/reference memory cost
我有一个具有 2 个属性的 Java 对象。此对象属性之一是字符串。实际上,对象的每个实例都将具有相同的值(或 2 个值之一)
例如:
public record Car (String modelId, String brand) {}
如果我有数百万个这样的对象,每个对象都有不同的 modelId
,但是 brand
= Ford
或 Volkswagen
,[=41 如何=] 在内存方面管理 brand
属性?
我认为(?)Ford
和 Volkswagen
字符串对象只有一个实例,每个 Car
都有一个指向这些字符串的指针或引用 - 是这个正确吗?
我的主要问题:鉴于我们只有指向品牌 属性 的指针,删除 brand
[=43= 是否节省了内存? ] 相当小?也就是说,如果我从 Car
中删除 String brand
属性,尽管有数百万个 Car
实例,但我不会在内存方面节省太多?
奖励点:从内存堆栈中删除(?100万)个指针可以节省多少内存?
您可以使用string interning来确保每个重复的字符串指向相同的内存。
否则,如果您创建 1,000,000 个字符串并将它们设置为值“Ford”,则您已经在内存中创建了 1,000,000 个组成“Ford”的字节副本。
我有一个具有 2 个属性的 Java 对象。此对象属性之一是字符串。实际上,对象的每个实例都将具有相同的值(或 2 个值之一)
例如:
public record Car (String modelId, String brand) {}
如果我有数百万个这样的对象,每个对象都有不同的 modelId
,但是 brand
= Ford
或 Volkswagen
,[=41 如何=] 在内存方面管理 brand
属性?
我认为(?)Ford
和 Volkswagen
字符串对象只有一个实例,每个 Car
都有一个指向这些字符串的指针或引用 - 是这个正确吗?
我的主要问题:鉴于我们只有指向品牌 属性 的指针,删除 brand
[=43= 是否节省了内存? ] 相当小?也就是说,如果我从 Car
中删除 String brand
属性,尽管有数百万个 Car
实例,但我不会在内存方面节省太多?
奖励点:从内存堆栈中删除(?100万)个指针可以节省多少内存?
您可以使用string interning来确保每个重复的字符串指向相同的内存。
否则,如果您创建 1,000,000 个字符串并将它们设置为值“Ford”,则您已经在内存中创建了 1,000,000 个组成“Ford”的字节副本。