静态成员是否有助于内存效率?

Han*_*etz 17 java memory-management

如果我有一个类,我期望在一个对内存敏感的应用程序中的数千个实例中使用它,如果我将静态功能分解为静态成员会有帮助吗?

我想静态方法和变量每个类存储一次,而对于非静态成员,必须为每个实例存储一些东西.

使用成员变量,似乎很清楚,但是为方法存储了哪种数据?

我正在使用Java,但我想象一些适用于其他托管环境(例如.NET)的通用规则.

Mic*_*urr 20

静态方法和幕后非静态(实例)方法之间的唯一区别是,额外的隐藏参数(this)被传递给实例方法,并且可以使用间接调度(如果是虚拟)调用实例方法.没有额外的代码空间.

编辑:


我的回答集中在方法上,但仔细阅读后我发现问题更多的是静态数据.是的,静态数据在某种意义上会节省内存,因为它只有一个副本.当然,数据是否应该是静态的更多地取决于数据的含义或用途,而不是存储器节省.

如果您需要拥有大量对象并希望节省内存,您可能还需要调查是否适用"Flyweight"模式.

  • 没有"静态物体"这样的东西 (5认同)
  • 不,但每次你创建一个对象的实例,它被分配到内存中,使用静态对象时,这种情况永远不会发生,因为你只有一个对象. (3认同)

Jon*_*eet 17

不应以效率为由做出决定 - 应以正确性为依据.

如果您的变量表示每个实例的不同值,则它应该是实例变量.

如果您的变量是与该类型相关联的公共值而不是该类型的单个实例,则它应该是静态变量.

但是,你是正确的 - 如果你有一个静态变量,你不会为每个实例"支付".这只是增加了一个额外的理由,使变量在不代表对象状态的一部分时保持静态.

当你提到问题中的方法时,你在谈论局部变量吗?您将为每个方法调用获得一组新的局部变量 - 包括递归调用.但是,这不会创建一组新的静态或实例变量.


Ste*_*314 7

如果您将成员变量设为静态,则可以为每个实例节省内存(假设有多个实例),但真正的好处是您不必努力使所有这些非静态成员彼此保持一致,并且您不需要当前实例来访问静态成员。

如果将方法设为静态,则每次嵌套调用都会在堆栈上保存几个字节(没有隐式的“this”参数),但这仅在执行非常繁重的递归时才相关。当然,如果函数需要知道您正在处理哪个实例,则无论如何您都需要一个显式参数来替换隐式“this”,因此您一无所获。

拥有静态方法或就此而言,非静态方法没有每个实例的成本。费用发生在通话中。

使用静态方法的真正原因是因为没有实例——至少在调用方法时是这样。例如,您可以使用静态方法来创建和初始化实例(“工厂”设计模式之一),或引用单例实例。