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

时间:2017-03-20 23:10:26

标签: java memory static-members

我目前正在用Java编写游戏,我正在尝试做一些简单的设计决策,这些决策将减少内存使用量(以防止以后必须进行大量更改以减少内存使用量)。游戏的主要布局将是一个十六进制网格,我将使用HashMap来存储十六进制。每个条目将有一个Point对象作为键,并且{ {1}}类型对象(Hex是一个接口)作为值。我将有两个实现Hex的不同对象; HexOceanHex

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

一般来说,我的问题是:对于只包含静态字段的类,对象的许多实例会占用与具有多个引用对象的一个​​对象实例相同的空间量吗?

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

3 个答案:

答案 0 :(得分:3)

虽然每个实例都使用内存,但在大多数机器上都可以忽略不计(详见this question)。您应该考虑引入复杂性(例如单例)以避免内存使用的唯一情况是,当您在非常有限的硬件上运行或者您打算拥有非常大量的对象时。我怀疑其中任何一个都适用于游戏。首先考虑简单明了的代码,然后在遇到问题时查看优化资源。

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

答案 1 :(得分:1)

无论是实例化单个实例还是多个实例,都将始终具有相同数量的引用。许多人指向同一个对象或许多指向许多对象。

由于引用的数量相同,问题实际上变成了:许多对象占用的内存多于单个对象。

静态性质并不重要的原因是因为您仍然会实例化至少具有标题和GC足迹的对象。

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

答案 2 :(得分:0)

是的,每个实例都会记忆。

相反地想一想:一切都来自Object。因此,每次制作某个new实例时,它至少都是Object的实例。