仅包含静态字段的对象的内存使用

Memory Usage for Objects That Only Contain Static Fields

我目前正在 Java 中编写游戏,我正在尝试做出一些简单的设计决策,以从一开始就减少内存使用(以防止以后不得不进行大的更改以减少内存使用)。游戏的主要布局将是一个六角形网格,我将使用 HashMap 来存储六角形。每个条目将有一个 Point 对象作为键,并且 Hex类型对象(Hex是一个接口)作为值。我将有两个不同的对象来实现 Hex; OceanHexLandHex.

虽然 LandHex 将包含很多字段(建筑物、统计数据、当前在板块上的玩家),但玩家将无法在海洋板块上建造或移动。从本质上讲,它们只是美学。出于这个原因,OceanHex 将只包含 2 个静态最终成员,使 OceanHex 的每个实例都相同。我最初计划通过仅实例化一个 OceanHex 实例并让每个海洋瓦片引用该实例来减少内存使用,但这让我很好奇。由于 OceanHex 仅包含静态字段,因此 OceanHex 的许多实例实际上会比单个实例使用更多的内存吗?

一般来说,我的问题是:对于只包含静态字段的 class,对象的多个实例占用的 space 数量是否与对象的一个​​实例占用的数量相同有很多参考资料吗?

我想创建 classes 的实例只有静态字段是很少见的,但我还是很好奇。

是的,每个实例都会占用内存。

改为这样想:一切都继承自 Object。因此,每次您创建某物的 new 实例时,它至少是 Object.

的实例

虽然每个实例都使用内存,但在大多数机器上可以忽略不计(有关详细信息,请参阅 this question)。您应该考虑引入复杂性(例如单例)以避免内存使用的唯一情况是当您 运行 在非常有限的硬件上或者您打算拥有非常多的对象时。我怀疑这些中的任何一个对于游戏来说都是正确的。首先寻求简单、清晰的代码,然后在遇到问题时再考虑优化资源。

如果您决定共享您的实例,我建议您查看 Flyweight Design Pattern 以了解实施细节。

无论你实例化单个实例还是多个实例,你将始终拥有相同数量的引用。许多指向相同的 object 或许多指向许多 objects.

由于引用的数量相同,问题就变成了:许多object比单个object占用更多的内存。

静态性质并不重要的原因是因为您仍然会实例化 objects,它们都至少有一个 header 和一个 GC 足迹。

所以答案是:是的 更多 objects 意味着使用更多的内存。