La Gestione della Memoria. Carla Binucci e Walter Didimo

Documenti analoghi
Gestione della memoria in Java. Emilio Di Giacomo e Walter Didimo

Gli oggetti. Ogni oggetto ha un interfaccia e ogni oggetto ha un tipo. Incapsulamento. Oggetti. Contatore. Invio di Messaggi

Definizione di classi. Walter Didimo

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Programmazione con Java

Allocazione dinamica della memoria

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Spazio di indirizzamento virtuale

Architetture dei Calcolatori

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

La Ricorsione. Carla Binucci e Walter Didimo

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Introduzione alla Programmazione in Java attraverso un esempio commentato

Programmazione I - corso B a.a prof. Viviana Bono

Allocazione Dinamica della Memoria

Record di Attivazione

Uso di metodi statici. Walter Didimo

Esonero di Informatica I. Ingegneria Medica

20. Gestione della memoria. Andrea Marongiu Paolo Valente

Le basi del linguaggio Java

Introduzione all uso degli oggetti in Java (parte I) Walter Didimo

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso sul linguaggio Java

Linguaggi ad oggetti. Linguaggi di Programmazione: Paradigmi di Programmazione. I principali linguaggi ad oggetti. Programmazione ad oggetti.

Corso di Informatica

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Assembly (3): le procedure

Introduzione ai puntatori

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Strutture dati nel supporto a run time

FUNZIONI: IL MODELLO A RUN-TIME!

Funzioni, Stack e Visibilità delle Variabili in C

L oggetto creato. Creazione di Oggetti. Rectangle: il concetto 10. Costruzione. Lo spazio di memoria del linguaggio Java. Rectangle: l oggetto

Gestione dinamica della memoria

Java Gli array. Array

Programmazione ad oggetti

Parametri Formali di una Funzione e Record di Attivazione

Allocazione dinamica della memoria

PROGRAMMAZIONE 2 5. Dynamic dispatch

Ingegneria del Software

Assembly (3): le procedure

Gestione della memoria

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

FUNZIONI: IL MODELLO A RUN-TIME

Introduzione al C. Unità Gestione Dinamica della Memoria

Lezione 9 programmazione in Java Classi come contenitori

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Lezione 11 programmazione in Java. Anteprima. Gestione della memoria

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

Assembly IV Le procedure

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

Strutture Dati Dinamiche

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente. per variabili di tipo array, in cui dover

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Concetto di Funzione e Procedura METODI in Java

Usare e costruire oggetti. Concetti Fondamentali. Interfaccia Pubblica di una. Application Program Interface

Allocazione dinamica della memoria

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Corso di Informatica Modulo T3 2 Ambiente locale e globale

Allocazione statica della memoria

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Perché il linguaggio C?

Ingegneria del Software T. Garbage Collector

Introduzione alla programmazione. Walter Didimo

Linguaggi ad oggetti (object oriented) LINGUAGGI DI PROGRAMMAZIONE: PARADIGMI DI PROGRAMMAZIONE. Programmazione ad oggetti

L'Allocazione Dinamica della Memoria nel linguaggio C

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

15 April LABORATORIO 04 PROCEDURE STACK. CHIAMATA A PROCEDURE I. Frosio

Corso sul linguaggio Java

L Allocazione Dinamica della Memoria

Realizzazione di Classi. Emilio Di Giacomo e Walter Didimo

Introduzione all uso degli oggetti in Java (parte II) Walter Didimo

Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010

PROVA SCRITTA DI FONDAMENTI DI INFORMATICA L A 4 DICEMBRE 2003 Prof. Michela Milano COMPITO A

Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.

Oggetti. Oggetti e occultamento delle informazioni. Definire oggetti. Oggetti. Definire oggetti la sintassi. Convenzione sugli identificatori

Ottenere una modifica del parametro attuale

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Macchine astratte, linguaggi, interpretazione, compilazione

Il puntatore. Il puntatore

Architettura dei calcolatori e sistemi operativi. Sottoprogrammi e MIPS. Espressioni algebriche. Capitolo 2 P&H

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Transcript:

La Gestione della Memoria Carla Binucci e Walter Didimo

Esecuzione di programmi Java L esecuzione di un programma Java richiede: la compilazione del codice Java in bytecode Java (un linguaggio macchina astratto) l interpretazione del bytecode Java da parte della macchina virtuale Java () Programma java bytecode Java interprete Java per pentium interprete Java per sparc (X.java) compilatore Java (X.class) indipendente dalla piattaforma interprete Java per risc

Modello RunTime Vogliamo descrivere alcuni aspetti della gestione della memoria nell esecuzione di applicazioni Java l esecuzione di una applicazione richiede la gestione della memoria associata alle classi, agli oggetti e ai metodi e costruttori Studiamo il modello runtime (cioè il modello del tempo di esecuzione) per l invocazione di metodi e costruttori e per la gestione di classi e oggetti ignoriamo molte altre problematiche circa l esecuzione di un applicazione

Gestione della Memoria La gestione della memoria è affidata alla il sistema operativo assegna memoria alla affinché possa gestire classi, oggetti e l esecuzione di metodi e costruttori La gestione della memoria avviene per aree di memoria ciascuna area di memoria serve a memorizzare variabili e/o altre informazioni un area di memoria può essere destinata a una classe, a un oggetto, all esecuzione di un metodo (d istanza o di classe) o all esecuzione di un costruttore

Aree di Memoria Le aree di memoria sono assegnate in modo dinamico allocare un area di memoria significa riservare una porzione di memoria per uno scopo specifico deallocare un area di memoria significa liberare quella porzione di memoria, affinché possa essere usata per altri scopi

Esecuzione di metodi il modello di gestione della memoria per l esecuzione dei metodi consiste nella gestione di aree di memoria chiamate record di attivazione ciascun record di attivazione ha lo scopo di memorizzare le informazioni necessarie a una singola esecuzione di un metodo i diversi record di attivazione necessari per l esecuzione di un programma sono gestiti mediante una struttura di dati a pila, chiamata record di attivazione m m1

Pila di attivazione La è una sequenza ordinata di record di attivazione: ogni volta che un metodo o costruttore deve essere eseguito, viene allocato un nuovo record di attivazione, posto in cima alla pila il metodo o costruttore correntemente in esecuzione è quello il cui record di attivazione è in cima alla pila quando un metodo o costruttore termina, il suo record di attivazione viene deallocato e rimosso dalla pila

Record di attivazione Un record di attivazione contiene le seguenti informazioni: : riferimento all oggetto ricevente se il metodo è di istanza, o alla classe ricevente se il metodo è di classe : informazioni sull istruzione che ha invocato il metodo - fa sempre riferimento al record di attivazione sottostante variabili locali m x istr. in m1 Classe m1..

Un esempio - Quadruplo Consideriamo la seguente applicazione: class Quadruplo { public static int somma(int h, int k) { int s; // somma, 1 s = h+k; // somma, return s; // somma, 3 } public static int doppio(int n) { int d; // doppio, 1 d = somma(n,n); // doppio, return d; // doppio, 3 } public static void main(string[] args) { int a, b, c; // main, 1 a = ; // main, b = doppio(a); // b = // main, 3 c = doppio(b); // c = 8 // main, } }

Quadruplo t=0 Vogliamo descrivere l esecuzione dell applicazione Quadruplo concentrandoci sull allocazione e deallocazione dei record di attivazione nella pila di attivazione Nell istante t=0 la alloca un area di memoria per la classe Quadruplo l area di memoria per una classe contiene, tra l altro, le variabili di classe (in questo caso nessuna) Quadruplo

Quadruplo t=1 Nell istante t=1 la avvia l esecuzione della classe Quadruplo, invocando il metodo di classe main in questo istante viene allocato il record di attivazione per l invocazione del metodo main main a b c Quadruplo

Quadruplo t= Nell istante t= viene eseguita l assegnazione a= il valore della variabile locale a viene dunque aggiornato nel record di attivazione del main main a b c Quadruplo

Quadruplo t=3 Nell istante t=3 viene invocato il metodo doppio con parametro attuale a subito dopo aver allocato il record di attivazione per il metodo doppio, la copia il valore dei parametri attuali nei corrispondenti parametri formali doppio main n d a b c main, 3 Quadruplo

Quadruplo t= Nell istante t= viene invocato il metodo somma con parametri attuali n e n somma h k s doppio, doppio main n d a b c main, 3 Quadruplo

Quadruplo t=5 Nell istante t=5 viene eseguita l istruzione s=h+k somma h k s doppio, doppio main n d a b c main, 3 Quadruplo

Quadruplo t=6 Nell istante t=6 viene eseguita l istruzione return s l invocazione di somma termina in base al di somma viene determinata la prossima istruzione da eseguire la prossima istruzione da eseguire è l assegnazione del valore restituito da somma alla variabile d, nel metodo doppio il record di attivazione di questa invocazione di somma viene rimosso

Quadruplo t=6 Nell istante t=6 viene eseguita l istruzione return s somma doppio main h k s n d a b c doppio, main, 3 Quadruplo

Quadruplo t=7 Nell istante t=7 viene eseguita l istruzione return d l invocazione di doppio termina ed il suo record di attivazione viene rimosso la prossima istruzione da eseguire (nel main) è l assegnazione del valore restituito da doppio a b doppio main n d a b c main, 3 Quadruplo

Quadruplo t=8 Nell istante t=8 viene invocato il metodo doppio con parametro attuale b viene dunque allocato un nuovo record di attivazione per la nuova invocazione del metodo doppio doppio main n d a b c main, Quadruplo

Quadruplo t=9 Nell istante t=9 viene invocato il metodo somma con parametri attuali n e n somma h k s doppio, doppio main n d a b c main, Quadruplo

Quadruplo t=10 Nell istante t=10 viene eseguita l assegnazione s=h+k somma h k s doppio, 8 doppio main n d a b c main, Quadruplo

Quadruplo t=11 Nell istante t=11 viene eseguita l istruzione return s l invocazione di somma termina somma doppio main h k s n d a b c doppio, 8 main, 8 8 Quadruplo

Quadruplo t=1 Nell istante t=1 viene eseguita l istruzione return d l invocazione di doppio termina doppio main n d a b c main, 8 8 8 Quadruplo

Quadruplo t=13 Nell istante t=13 termina anche il metodo main la si svuota e l applicazione termina main a b c 8 Quadruplo

Gestione degli Oggetti - heap Il modello runtime prevede una gestione delle aree di memoria per gli oggetti diversa da quella per l esecuzione di metodi e costruttori le aree di memoria per gli oggetti e per le classi sono allocate in una zona di memoria chiamata heap (mucchio), perché l ordine di tali aree non è rilevante m ClasseA m1 heap

Gestione degli Oggetti L area di memoria per un oggetto viene allocata solo al momento della creazione dell oggetto, e deallocata quando l oggetto non verrà più utilizzato nel programma c1:classea ClasseA heap

Un altro esempio - ProvaComplesso Consideriamo la seguente applicazione che crea e usa oggetti della classe Complesso: class ProvaComplesso { public static void main(string[] args) { Complesso x, y; x = new Complesso(3.0,.0); // main, 1 y = new Complesso(-3.0,.0); // main, x.sommati(y); // main, 3 } } Vogliamo descrivere l esecuzione dell applicazione ProvaComplesso concentrandoci sulla allocazione e deallocazione di oggetti nello heap, mostrando anche la

La classe Complesso Ecco il codice del costruttore e del metodo sommati della classe Complesso: class Complesso {... /** crea un nuovo Complesso */ public Complesso(double re, double im) { this.re = re; this.im = im; }... /** si somma a un altro Complesso */ public void sommati(complesso altro) { this.re += altro.re; this.im += altro.im; }... }

Il Diagramma Sequenza Ecco il diagramma sequenza per ProvaComplesso: ProvaComplesso static main(...) t=0... t=1 main(...) x = new Complesso(3.,.) t= t=3 y = new Complesso(-3.,.) t= t=5 c1.sommati(c) t=6 t=7 c1: Complesso re = 3.0 im =.0 esecuzione del costruttore... esecuzione del metodo sommati c : Complesso re = -3.0 im =.0 esecuzione del costruttore t=8

ProvaComplesso t=0 Nell istante t=0 la carica in memoria la classe ProvaComplesso, allocando un area di memoria nello heap nessun metodo è in esecuzione nessun oggetto è stato creato ProvaComplesso heap

ProvaComplesso t=1 In t=1 viene avviata l esecuzione della classe ProvaComplesso, invocandone il metodo di classe main vengono allocate le variabili locali x e y di main di tipo Complesso essendo stata chiamata in causa, viene allocata un area di memoria per la classe Complesso main x y Complesso ProvaComplesso heap

ProvaComplesso t= In t= viene eseguita l istruzione x = new Complesso(3.0,.0) viene creato un primo oggetto Complesso - c1 la creazione di c1 richiede l allocazione di un area di memoria nello heap per memorizzarne, tra l altro, le variabili d istanza re e im viene invocato il costruttore di Complesso viene creato un record di attivazione per il costruttore Costr main main,1 re 3 im x y c1 : Complesso re im Complesso ProvaComplesso heap

ProvaComplesso t=3 In t=3, dopo che è stato eseguito il corpo del costruttore, il costruttore viene rimosso dalla viene poi eseguita l assegnazione a x Costr main main,1 re 3 im x y c1 : Complesso re im 3 Complesso ProvaComplesso heap

ProvaComplesso t= In t= viene eseguita l istruzione y = new Complesso(-3.0.0,,.0) viene creato un altro oggetto Complesso - c e allocata un area di memoria nello heap per c viene invocato il costruttore di Complesso e creato un record di attivazione per il costruttore c : Complesso re im Costr main main, re -3 im x y c1 : Complesso re im 3 Complesso ProvaComplesso heap

ProvaComplesso t=5 In t=5, dopo che il costruttore è stato eseguito, il suo recordo di attivazione viene rimosso dalla pila viene poi eseguita l assegnazione a y c : Complesso re im -3 Costr main main, re -3 im x y c1 : Complesso re im 3 Complesso ProvaComplesso heap

ProvaComplesso t=6 In t=6 viene eseguita l istruzione x.sommati(y) viene creato un record di attivazione per sommati c : Complesso re im -3 c1 : Complesso sommati main altro x y main,3 re im 3 Complesso ProvaComplesso heap

ProvaComplesso t=7 In t=7, dopo che il metodo sommati è stato eseguito, il suo record viene rimosso dalla osserva che l esecuzione di sommati ha modificato lo stato dell oggetto c1 c : Complesso re im -3 c1 : Complesso sommati main altro x y main,3 re im 0 6 Complesso ProvaComplesso heap

ProvaComplesso t=8 In t=8 il metodo main termina ed il suo record è rimosso dalla non essendo referenziati altrove, gli oggetti c1 e c verranno deallocati c : Complesso re im c1 : Complesso re im -3 0 6 main x y Complesso ProvaComplesso heap

Vita di oggetti, classi e variabili L allocazione di aree di memoria è dinamica e temporanea Un area di memoria è considerata allocata fintanto che il rispettivo proprietario è vivo parliamo di vita di un oggetto o classe vita di una variabile

Vita di un oggetto inizia quando l oggetto viene creato con new termina quando l oggetto non è più accessibile un oggetto è accessibile se esiste una variabile che direttamente o indirettamente lo referenzia un oggetto non accessibile, non ha più nessuna utilità e la può decidere di distruggerlo l individuazione e la rimozione di oggetti inaccessibili si chiama garbage collection (raccolta della spazzatura) e viene svolta automaticamente dalla

Vita di una variabile d istanzad coincide con la vita dell oggetto a cui appartiene termina quando l oggetto non è più accessibile una variabile d istanza di un oggetto viene allocata (nello heap) quando l oggetto viene creato una variabile d istanza viene deallocata quando l oggetto viene rimosso

Vita di una classe inizia quando la classe viene utilizzata per la prima volta dall applicazione in esecuzione la classe viene caricata in memoria dalla l area di memoria riservata per la classe viene deallocata quando l applicazione termina

Vita di una variabile di classe coincide con la vita della classe a cui appartiene una variabile di classe viene allocata nello heap quando la classe viene caricata l area di memoria della classe viene deallocata quando termina l esecuzione dell applicazione

Vita di una variabile locale La vita di una variabile locale (o di un parametro formale) a un metodo o costruttore coincide con il tempo di esecuzione del metodo o costruttore viene allocata quando il metodo o costruttore viene invocato l allocazione avviene nella, nell ambito del record di attivazione associato all esecuzione del metodo o costruttore viene deallocata quando il metodo o costruttore termina

Glossario dei termini principali Termine Modello Runtime Area di memoria Record di attivazione Pila di attivazione Heap Vita di un oggetto, di una classe e di una variabile Garbage collection Significato Il modello al tempo di esecuzione dei programmi. Nel caso dei linguaggi di programmazione ad oggetti come Java, il modello runtime consiste nelle modalità di gestione degli oggetti da parte del calcolatore Gruppo consecutivo di byte. Un area di memoria serve a memorizzare variabili e/o altre informazioni. Le aree di memoria vengono gestite dinamicamente mediante allocazione e deallocazione Area di memoria destinata a memorizzare le informazioni necessarie ad una singola esecuzione di un metodo. Sequenza ordinata dei record di attivazione necessari per l esecuzione di un programma Zona di memoria in cui vengono allocate, senza seguire alcun ordine significativo, le aree di memoria per le classi e/o gli oggetti. Intervallo di tempo in cui rimane allocata un area di memoria rispettivamente per un oggetto, una classe e una variabile Processo di ricerca e distruzione degli oggetti inaccessibili, ovvero di quegli oggetti che non sono più referenziati