2010-06-25 54 views

回答

15

否 - 更改为静态方法对内存没有影响。

第一次引用类型(无论是静态还是非静态),将初始化任何静态成员并运行静态构造函数。但是,如果您只是考虑将方法从非静态方式切换到静态方式,这将对垃圾回收或总内存占用情况没有影响。

如果将类成员更改为静态成员,则只需要担心内存占用情况发生变化。在这种情况下,一旦类型被访问,静态字段将保持为根,并且不会被GC收集。这通常只在必要时完成,并且通过设计 - 您将会员设置为静态,因为您希望会员持续存在。

+0

是否存在存储在任何位置的静态方法的副本?我的假设是,当你引用一个静态方法时,它将被存储在某个地方,然后每个后续引用都会使用该方法的实例,但我知道这个假设可能是错误的。 – 2010-06-25 17:38:09

+3

无论是静态还是实例方法,“方法”在进入进程空间时都会在内存中加载一次,并由JIT编译。静态和非静态方法使用方面确实没有区别。关注静态方法是否适合您的特定情况 - 并用它来确定方法应该是静态方法还是实例方法。 – 2010-06-25 17:40:30

+0

对内存的影响非常小 - 因为会生成额外的代码来将“this”指针传递给不使用它的方法。 – Qwertie 2010-06-25 18:21:32

7

从JIT编译器的角度来看,静态方法和实例方法没有区别。他们的机器代码非常相似,它被存储在同一种堆中。唯一的区别是一个实例方法有一个额外的参数。

该方法被调用时需要传递额外的参数。这会花费额外的机器码指令,但并不经常。 CPU寄存器(ECX)经常具有正确的值。如果一个实例方法在x86上有多个参数或在x64上有三个以上参数,则有一个区别,必须在堆栈上传递额外的参数,而不是通过CPU寄存器。一个额外的指令。

最糟糕的情况是,你正在看的不到一纳秒。这将很难衡量,这是微型优化的常见问题。

+0

这可能超出了原始问题的范围,但是在调用静态方法或不调用方法时存储在堆上的内容是什么?它只是方法本身,还是包含方法的类的实例,或者其他什么? 垃圾收集是否收集过这种记忆? – 2010-06-25 18:24:36

+0

在方法调用期间没有任何东西存储在堆上。参数通过CPU寄存器和堆栈传递。什么都不需要收集。 Petzold的书“代码”可能会让你感兴趣。 – 2010-06-25 18:40:37

+0

好吧,这很有道理。所以真的,将我的方法从非静态转换为静态的唯一原因是在没有类实例的情况下访问它们?感谢您的推荐。 – 2010-06-25 18:44:37

相关问题