PROGRAMMAZIONE AVANZATA JAVA E C Massimiliano Redolfi Lezione 2: digging into Java Multipiattaforma Il C è un linguaggio Multipiattaforma? Sorgete C Compilatore per MacOsx Compilatore per Linux Compilatore per Windows Compilatore per … Eseguibile MacOsx Eseguibile Linux Eseguibile Windows Eseguibile … MacOsx Linux Windows … e Java? Sorgete Java Compilatore Java ‘eseguibile’ Java bytecode VM Java per MacOsx VM Java per Linux VM Java per Windows VM Java per … MacOsx Linux Windows … java: compilare ed eseguire javac java java: perché Java non è poi così lento? javac compila in bytecode… java interpreta il bytecode e lo trasforma in codice eseguibile dal calcolatore… un sacco di tempo perso ad ogni istruzione?? SI! Se non ci fosse JIT (Just in Time compiler) JIT is lazy and adaptive http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm java: compilare ed eseguire… e ritornare javap java: compilare ed eseguire… e ritornare javap http://jd.benow.ca/ GC in azione Ma quanta RAM usi? Stack e Heap: l’ordine dello stack Uno stack funziona come… uno stack! Inserisco sulla cima della pila ed estraggo dalla cima… un bel mondo LIFO Perché? Perché gli ambiti di visibilità delle variabili non si intersecano ma sono annidati uno dentro l’altro, e se voglio uscire da un ambito di visibilità devo prima uscire da quelli più interni… stack Stack e Heap: il ‘disordine’ dello heap ? Nello heap sono libero di allocare e deallocare quando voglio… addio bel mondo LIFO… compaiono i primi buchi… Che fare? heap Stack e Heap: Heap il ‘disordine’ dello heap spazio libero Ecco una nuova variabile da allocare nello heap… dove la metto? heap Stack e Heap: Heap l’ordine del C spazio libero Ecco una nuova variabile da allocare nello heap… dove la metto? Il C è un linguaggio che non spreca inutilmente spazio, è attento e coscienzioso e cerca di riempire tutto per bene… Peccato che se gestisco migliaia di oggetti ci metto una vita a trovare lo spazio libero in cui allocare… heap Stack e Heap: Heap la noncuranza di Java spazio libero E Java che fa? Java non si preoccupa dello spazio lasciato libero, va sempre alla ricerca di risorse fresche! in cima allo heap opss… ma non siamo in una macchina di touring… qui la memoria prima o poi finisce… e qui entra in GioCo il GC (Garbage Collector) heap Stack e Heap: Heap il Garbage Collector in azione Compito del GC è eliminare la spazzatura, che nella fattispecie sono gli spazi vuoti nello heap rimasti inutilizzati ma quando farlo e come farlo? spazio libero Quando: prima di esaurire la memoria e cercando di evitare di interrompere il programma principale… Il GC controlla lo stato di occupazione delle RAM e quanto rileva che si è prossimi ad un suo esaurimento, o ad un’occupazione eccessiva o ci sono troppi ‘buchi’…. allora decide di intervenire Come: ci sono diversi schemi di funzionamento, il principio base è copia tutto ciò che è buono in un nuovo blocco di memoria contiguo, che diventa il nuovo heap heap Stack e Heap: Heap il Garbage Collector in azione spazio libero Come: ci sono diversi schemi di funzionamento, il principio base è copia tutto ciò che è buono in un nuovo blocco di memoria contiguo, che diventa il nuovo heap heap heap copia Stack e Heap: Heap il Garbage Collector in azione Come: ci sono diversi schemi di funzionamento, il principio base è copia tutto ciò che è buono in un nuovo blocco di memoria contiguo, che diventa il nuovo heap spazio libero Butta il vecchio heap, e ricomincia heap heap copia Stack e Heap: Heap il Garbage Collector in azione Come: ci sono diversi schemi di funzionamento, il principio base è copia tutto ciò che è buono in un nuovo blocco di memoria contiguo, che diventa il nuovo heap Butta il vecchio heap, e ricomincia Ma come tengo traccia degli oggetti allocati? Soluzione A: Un counter che si incrementa e decrementa ogni volta che creo o distruggo oggetti Soluzione B: Non uso counter di sorta quando voglio vedere se una risorsa è allocata parto dallo stack e risalgo tutta la catena, così mi evito anche un po’ di problemi… ed è anche per questo che le reference agli oggetti di base, come a tipi primitivi le lascio nello stack… heap Stack e Heap: Heap il Garbage Collector in azione W lo stack! PS: lo stack ha un limite di 1Mbyte su macchine a 64 bit, tale limite può essere ridotto (ogni thread ha un proprio Stack e questo viene preallocato a dimensione fissa… se si hanno molti thread diventa un problema…) Ma.. cosa sono i thread??? ok più avanti! per ulteriori dettagli: https://www.youtube.com/watch?v=DoJr5QQYsl8 heap stack GC: System.gc() & finalize() System.gc() forza l’entrata in azione del GC che svuota ripulisce rialloca Quando usarla: praticamente mai! più o meno… Tips: Se andate a corto di RAM prima di pensare a System.gc() di solito è il caso di controllare il vostro codice… finalize() è un metodo della classe Object di cui si può fare l’override. Viene richiamato appena prima che il GC rimuova dalla memoria l’oggetto Quando usarla: praticamente mai! anche qui più o meno… E’ il distruttore C++?: NO, non sapete quando verrà chiamato e questo è un problema Tips: raramente si utilizza per gestire la chiusura di risorse non connesse con l’allocazione di RAM, ma è diventata consuetudine non utilizzarlo nemmeno in questi casi. L’utilizzo più diffuso è in alcuni casi di debug… E ora… che GUI sia… (vedi esempi)