2010-06-25 10 views

Respuesta

15

No - Cambiar a métodos estáticos no tiene ningún efecto en la memoria.

La primera vez que se hace referencia a un tipo (ya sea estático o no estáticamente), se inicializan los miembros estáticos y se ejecutan constructores estáticos.

Sin embargo, si solo está considerando cambiar los métodos de no estático a estático, esto no tendrá ningún efecto en la recolección de basura o en la huella total de la memoria.

Solo tiene que preocuparse por el cambio de la huella de memoria si cambia los miembros de la clase para que sean miembros estáticos. En este caso, los campos estáticos permanecerán enraizados una vez que se acceda al tipo, y el GC no los recopilará. Normalmente, esto solo se hace cuando es necesario y, por diseño, hace que un miembro sea estático porque desea que persista.

+0

¿Hay alguna copia del método estático almacenada en algún lugar de la memoria? Mi suposición era que cuando hacía referencia a un método estático, se almacenaba en algún lugar, y cada referencia posterior usaría esa instancia del método, pero entiendo que esta suposición podría ser incorrecta. –

+3

"Métodos", ya sean métodos estáticos o de instancia, se cargan una sola vez en la memoria cuando se introducen en el espacio de proceso y compilados por el JIT. Realmente no hay diferencia en el uso del método entre estático y no estático. Concéntrese en si los métodos estáticos son apropiados en su caso específico y utilícelos para determinar si un método debe ser un método estático o de instancia. –

+0

Hay un efecto muy pequeño en la memoria, ya que se genera un código extra para pasar un puntero "this" a métodos que no lo usan. – Qwertie

7

Desde el punto de vista del compilador JIT, no hay diferencia entre un método estático y uno de instancia. El código de máquina para ellos es muy similar, se almacena en el mismo montón de tipo. La única diferencia es que un método de instancia tiene un argumento adicional.

Ese argumento adicional debe pasar cuando se llama al método. Eso puede costar una instrucción de código de máquina adicional, pero no tan a menudo. El registro de la CPU (ECX) con frecuencia ya tiene el valor correcto. Existe una diferencia si un método de instancia tiene más de un argumento en x86 o más de tres en x64, un argumento adicional tiene que pasar en la pila en lugar de a través de un registro de la CPU. Una instrucción adicional.

En el peor de los casos, estás viendo un poco menos de un nanosegundo. Eso va a ser difícil de medir, el problema habitual con las micro-optimizaciones.

+0

Esto puede ir más allá del alcance de la pregunta original, pero ¿qué se almacena en el montón cuando se llama un método, estático o no? ¿Es solo el método en sí, o una instancia de la clase que contiene el método, o algo completamente diferente? ¿Alguna vez la colección de basura ha recogido esta memoria? –

+0

No se almacena nada en el montón durante una llamada a método. Los argumentos se pasan a través de los registros de la CPU y la pila. Nada necesita ser recogido. El "Código" de Petzold puede interesarte. –

+0

Ok eso tiene mucho sentido. Entonces, ¿realmente, la única razón para convertir mis métodos de no estático a estático sería acceder a ellos sin instanciación de clase? Gracias por tu recomendación –

Cuestiones relacionadas