Han*_*etz 17 java memory-management
如果我有一个类,我期望在一个对内存敏感的应用程序中的数千个实例中使用它,如果我将静态功能分解为静态成员会有帮助吗?
我想静态方法和变量每个类存储一次,而对于非静态成员,必须为每个实例存储一些东西.
使用成员变量,似乎很清楚,但是为方法存储了哪种数据?
我正在使用Java,但我想象一些适用于其他托管环境(例如.NET)的通用规则.
Mic*_*urr 20
静态方法和幕后非静态(实例)方法之间的唯一区别是,额外的隐藏参数(this)被传递给实例方法,并且可以使用间接调度(如果是虚拟)调用实例方法.没有额外的代码空间.
编辑:
我的回答集中在方法上,但仔细阅读后我发现问题更多的是静态数据.是的,静态数据在某种意义上会节省内存,因为它只有一个副本.当然,数据是否应该是静态的更多地取决于数据的含义或用途,而不是存储器节省.
如果您需要拥有大量对象并希望节省内存,您可能还需要调查是否适用"Flyweight"模式.
Jon*_*eet 17
不应以效率为由做出决定 - 应以正确性为依据.
如果您的变量表示每个实例的不同值,则它应该是实例变量.
如果您的变量是与该类型相关联的公共值而不是该类型的单个实例,则它应该是静态变量.
但是,你是正确的 - 如果你有一个静态变量,你不会为每个实例"支付".这只是增加了一个额外的理由,使变量在不代表对象状态的一部分时保持静态.
当你提到问题中的方法时,你在谈论局部变量吗?您将为每个方法调用获得一组新的局部变量 - 包括递归调用.但是,这不会创建一组新的静态或实例变量.
如果您将成员变量设为静态,则可以为每个实例节省内存(假设有多个实例),但真正的好处是您不必努力使所有这些非静态成员彼此保持一致,并且您不需要当前实例来访问静态成员。
如果将方法设为静态,则每次嵌套调用都会在堆栈上保存几个字节(没有隐式的“this”参数),但这仅在执行非常繁重的递归时才相关。当然,如果函数需要知道您正在处理哪个实例,则无论如何您都需要一个显式参数来替换隐式“this”,因此您一无所获。
拥有静态方法或就此而言,非静态方法没有每个实例的成本。费用发生在通话中。
使用静态方法的真正原因是因为没有实例——至少在调用方法时是这样。例如,您可以使用静态方法来创建和初始化实例(“工厂”设计模式之一),或引用单例实例。
| 归档时间: |
|
| 查看次数: |
13994 次 |
| 最近记录: |