2010-06-25 14 views

risposta

15

No: il passaggio a metodi statici non ha alcun effetto sulla memoria.

La prima volta che si fa riferimento a un tipo (statico o non statico), i membri statici vengono inizializzati e vengono eseguiti i costruttori statici.

Tuttavia, se si sta considerando di passare da un metodo non statico a uno statico, ciò non avrà alcun effetto sulla raccolta dei dati obsoleti o sull'impronta di memoria totale.

È necessario preoccuparsi di modificare il footprint della memoria se si cambiano i membri della classe come membri statici. In questo caso, i campi statici rimarranno radicati dopo l'accesso al tipo e non verranno raccolti dal GC. Questo in genere viene eseguito solo quando necessario e in base alla progettazione: si crea un membro statico perché si desidera che persista.

+0

C'è una copia del metodo statico memorizzato in qualsiasi punto della memoria? La mia ipotesi era che quando si faceva riferimento a un metodo statico, esso veniva memorizzato da qualche parte, e quindi ogni riferimento successivo avrebbe usato quell'istanza del metodo, ma capisco che questa ipotesi potrebbe essere errata. –

+3

I "metodi", sia statici che istanza, vengono caricati una sola volta in memoria quando vengono portati nello spazio del processo e compilati dal JIT. Non c'è davvero alcuna differenza nell'uso del metodo tra statico e non statico. Concentrati sull'appropriatezza dei metodi statici nel tuo caso specifico e usali per determinare se un metodo debba essere statico o un metodo di istanza. –

+0

C'è un effetto molto piccolo sulla memoria - poiché viene generato un codice extra per passare un puntatore "this" a metodi che non lo usano. – Qwertie

7

Dal punto di vista del compilatore JIT, non vi è alcuna differenza tra un metodo statico e un metodo di istanza. Il codice macchina per loro è molto simile, viene memorizzato nello stesso tipo di heap. L'unica differenza è che un metodo di istanza ha un argomento in più.

Questo argomento aggiuntivo deve essere passato quando viene chiamato il metodo. Questo può costare un'istruzione di codice macchina aggiuntiva, ma non così spesso. Il registro CPU (ECX) spesso ha già il valore corretto. C'è una differenza se un metodo di istanza ha più di un argomento su x86 o più di tre su x64, un ulteriore argomento deve essere passato sullo stack piuttosto che attraverso un registro della CPU. Un'istruzione in più.

Nel peggiore dei casi, si sta osservando un po 'meno di un nanosecondo. Sarà difficile da misurare, il solito problema con le micro-ottimizzazioni.

+0

Questo può andare oltre lo scopo della domanda originale, ma cosa viene memorizzato nell'heap quando viene chiamato un metodo, statico o meno? È solo il metodo stesso o un'istanza della classe che contiene il metodo o qualcos'altro? Questa memoria viene mai raccolta dalla garbage collection? –

+0

Durante la chiamata al metodo non viene memorizzato nulla nell'heap. Gli argomenti vengono passati attraverso i registri della CPU e lo stack. Niente deve essere raccolto. Il libro "Codice" di Petzold potrebbe interessarti. –

+0

Ok, questo ha molto senso. Quindi, davvero, l'unica ragione per convertire i miei metodi da non statici a statici sarebbe quello di accedervi senza istanziazione di classe? Grazie per la tua raccomandazione –