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)
Scarica

PAJC_L02