Allocazione di memoria di classi che non hanno dati e blocchi globali

0
    static void Main(string[] args)
    {
        var c2 = new Class2();
        var c3 = new Class3();
        var c1 = new Class1(c2, c3);
        c1.Method1();
    }

    class Class1
    {
        readonly Class2 _class2;
        readonly Class3 _class3;
        public Class1(Class2 class2, Class3 class3)
        {
            _class2 = class2;
            _class3 = class3;
        }
        public void Method1() {
            _class2.PerformM1();
            _class3.PerformM2();
        }
    }
    class Class2
    {
        public void PerformM1()
        {
            //do some operation
        }
    }
    class Class3
    {
        public void PerformM2()
        {
            //do some operation
        }
    }

Domande basate sul codice precedente:

  1. Quanta memoria ha oggetto di Class1 quando viene creata?
  2. La memoria aumenta o diminuisce quando eseguo c1.Method1 (); tenendo presente che nessuna delle classi ha campi globali potrebbe acquisire qualsiasi spazio.

Modifica

Espansione con un'altra domanda:

  1. Se la creazione di nuovi oggetti di Class1 e i metodi di chiamata dell'oggetto c1 non comportano un uso eccessivo della memoria, è corretto dire che non ho bisogno di un blocco nel codice di esempio fornito sopra.

Posso semplicemente creare n numero di oggetti e assegnare singoli oggetti a una singola attività (o thread)?

    
posta shankbond 23.09.2013 - 18:28
fonte

2 risposte

4
  1. L'articolo (forse un po 'obsoleto) Drill Into .NET Framework Internals per vedere come il CLR Crea oggetti di runtime spiega che in .Net, ogni oggetto richiede almeno 8 byte (4 byte per syncblock, 4 byte per TypeHandle). Class1 ha due campi di istanza, entrambi sono riferimenti. Supponendo che il tuo codice sia in esecuzione come un'applicazione a 32 bit, significa 4 ulteriori byte per ogni riferimento. Ciò significherebbe che ogni istanza di Class1 richiede 16 byte in totale.

    Anche se questo mi rende confuso sul tuo titolo, perché Class1 ha alcuni stati.

  2. L'unica memoria richiesta direttamente dalla chiamata a Method1() è uno spazio di stack per il frame di attivazione della chiamata. Non allocherà alcuna memoria dall'heap.

Anche se, alla fine, è molto probabile che tutto ciò non ti importi.

is it correct to say that I don't need a lock in the above provided sample code.

È difficile da dire senza vedere il tuo codice. Ma in generale, creare un'istanza di una classe per ogni attività è un approccio valido. E questo include i tipi che hanno uno stato (supponendo che non sia stato condiviso).

    
risposta data 23.09.2013 - 21:30
fonte
1
  1. Puoi utilizzare il metodo GC.GetTotalmemory (false) per misurare l'utilizzo della memoria corrente.
  2. Puoi anche usare qualche tipo di profiler di memoria come red gate ANTS profiler di memoria

  3. Il consumo di memoria non dovrebbe aumentare quando c1.Method1 (); viene eseguito, dato C2, C3 non ha alcun oggetto inizializzato o si riferisce ad altre classi che hanno oggetti inizializzati.

risposta data 23.09.2013 - 18:50
fonte