Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态成员是否有助于提高内存效率?_Java_Memory Management - Fatal编程技术网

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

Java 静态成员是否有助于提高内存效率?,java,memory-management,Java,Memory Management,如果我有一个类,我希望在对内存敏感的应用程序中的数千个实例中使用它,那么如果我将静态功能分配给静态成员,它会有帮助吗 我设想静态方法和变量在每个类中存储一次,而对于非静态成员,必须为每个实例存储一些东西 对于成员变量,这似乎很清楚,但是为方法存储了什么样的数据呢 我在Java中工作,但我设想在其他托管环境(如.NET)中也会应用一些通用规则。静态方法和幕后非静态(实例)方法之间的唯一区别是一个额外的隐藏参数(this)传递给实例方法,并且可以使用间接分派(如果是虚拟的)调用实例方法。没有占用额外

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

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

对于成员变量,这似乎很清楚,但是为方法存储了什么样的数据呢


我在Java中工作,但我设想在其他托管环境(如.NET)中也会应用一些通用规则。

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

编辑:


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


如果需要有大量对象并希望节省内存,您可能还需要调查使用是否适用。

简单的答案是肯定的。每次创建实例都不等于重新创建整个对象,静态方法和变量通常会消耗更少的内存,具体取决于它们的使用方式。当然,如果您只需要在整个程序中创建一个实例,则没有区别。请记住,在没有静态对象且需要重用它们的情况下,始终可以将实例作为引用传递。

决策不应基于效率,而应基于正确性

如果您的变量代表每个实例的不同值,那么它应该是一个实例变量

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

然而,你是对的——如果你有一个静态变量,你不会为每个实例“付费”。这只是增加了一个额外的理由,使变量成为静态的,因为它们不代表对象状态的一部分


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

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

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

使用静态方法或非静态方法不会对每个实例产生任何成本。费用发生在电话上


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

不,但每次创建对象实例时,都会将其分配到内存中,使用静态对象,这永远不会发生,因为您只有一个对象。完全正确,关注方法。我想我已经得到了非常直观的静态数据,而且,正如你所说,不管怎样,这里的意义更重要。没有“静态对象”之类的东西,呵呵,没错,尽管只要人们理解我,我通常不太在意确切的术语:)但是,如果他们不这样做,那就用静态方法打我吧,我们正在节省内存,b'coz如果一个方法在整个应用程序中被多次访问,那么就不需要每次都创建一个实例来调用该方法。只需将该方法设置为静态,我们就可以节省大量内存。老实说,我甚至没有考虑过局部变量。我主要想知道什么数据与声明的方法相关,以及静态和非静态之间的区别。我一直希望通过智能JVM、操作系统和硬件开发人员的方式,正确性能给我带来效率。;-)至少乍一看,在调用之前,静态(或非静态)方法消耗的唯一内存是其实现代码。拥有一个从未使用过的隐式“this”参数应该不会有什么不同——决定方法代码大小的是方法的复杂性,而不是它是否声明为静态。