Prev   Top   Next 

La Method Area

La Method Area è la zona della Macchina Astratta che mantiene, a Run-Time, le informazioni di tipo necessarie per la corretta esecuzione del programma corrente.
All'interno della Method Area sono contenute delle strutture, una per ogni tipo coinvolto nell'interpretazione, sia esso classe o interfaccia. Tali strutture, che descrivono le varie classi o interfacce, sono dette Class Structure.

Dettaglio di una Class Structure
all'interno della Method Area

La Class Structure contiene, in maniera più compatta, lo stesso complesso di informazioni presente all'interno del file .class, generato dalla compilazione dei programmi Java.
Ogni classe ( o interfaccia ) è associata alla sua Class Structure tramite la Class Table del Class Manager.
La Class Structure mantiene, per ogni tipo, le informazioni necessarie alla sua manipolazione.

Nel caso di una classe, le informazioni contenute schematicamente sono:

  • il nome della classe;
  • un puntatore alla Class Structure associata alla superclasse;
  • un array di puntatori alle Class Structure relative alle interfacce implementate da questa classe;
  • una tabella, detta Run-Time Costant Pool.
    Tale tabella ha un ruolo molto simile a quello svolto dalla Symbol Table nei comuni linguaggi imperativi. Tuttavia, mentre la Symbol Table viene mantenuta solo a Compile-Time da parte del compilatore, e quindi i riferimenti in essa contenuti vengono risolti in maniera statica, la Run-Time Costant Pool è presente anche durante l'esecuzione ed è così utilizzabile a Run-Time, consentendo il linking dinamico.
    Ciò è utile perché permette una certa flessibilità nella stesura del codice, poiché se eventuali classi che si usano nel proprio programma cambiano dal momento della compilazione, non si avranno problemi a Run-Time fintanto che le classi usate forniscono lo stesso insieme di servizi ( con il linking statico ciò manderebbe in crash il programma ).
    Le informazioni memorizzate nella Run-Time Costant Pool sono di tre tipi:
    • costanti intere, booleane, reali o stringhe, utilizzate nel codice di uno o più dei metodi definiti nella classe in oggetto;
    • riferimenti ad altre classi, delle quali si creano istanze o si usano campi e metodi, all'interno dei metodi di questa classe;
    • riferimenti a campi o metodi definiti in altre classi. Tali entries consentono ai metodi della classe corrente di riferire campi o metodi di altre classi.
    Per chiarire le idee, consideriamo ad esempio la classe
    
    class X {
          void m( ) {
               Y   o = new Y();
               int c = 1674;
    
               o.n( );
          }
    }
    
    La Run-Time Costant Pool della classe X conterrà una entry per la costante intera 1674, una entry di riferimento alla classe Y ( per poterne creare un'istanza ), e una entry di riferimento al metodo n della classe Y.
  • una tabella, detta Method Table.
    Essa contiene, per ogni metodo definito in questa classe, le seguenti informazioni:
    • il nome completo del metodo;
    • il numero di variabili locali usate;
    • la massima profondità di stack degli operandi necessaria per l'esecuzione del metodo;
    • il descrittore, che indica, in maniera simbolica, la signature del metodo, cioè il numero e tipo degli argomenti, e il tipo del risultato. Tale informazione è necessaria allo Stack Manager per localizzare, nello stack degli operandi del metodo chiamante, gli argomenti per il metodo chiamato e l'oggetto ( this ) su cui esso viene invocato;
    • dei flag che descrivono le proprietà di accesso a questo metodo ( public, private ), e che specificano se si tratta di un metodo istanza o di classe, se esso è abstract o no, ...;
    • i bytecode del metodo ( ove questo non sia abstract );
  • una tabella, detta Field Table.
    Essa contiene le informazioni sui tipi dei campi istanza dichiarati in questa classe ed ereditati dalla superclasse. Per ciascuno di tali campi c'è una entry che li identifica con il loro nome completo ( classe di dichiarazione, nome del campo ) e che ne specifica il tipo e le proprietà di accesso ( public, private, package, ... ). Tale tabella costituisce un prototipo della porzione di memoria che bisognerà allocare nell'Heap per creare una nuova istanza di questa classe;
  • un insieme di locazioni che memorizzano il valore dei vari field di classe dichiarati in questa classe ( non quelli della superclasse ). Si tratta di locazioni accedute da istruzioni come getstatic, putstatic, che manipolano field di classe.
Nel caso delle interfacce, le parti presenti nella Class Structure sono sovrabbondanti; in particolare:
  • il puntatore super viene fatto puntare alla classe Object;
  • i puntatori alle interfacce puntano alle ( possibili ) superinterfacce;
  • la Run-Time Costant Pool è vuota, poiché essa specifica entità usate nei metodi;
  • la Method Table è vuota, poiché le interfacce non contengono implementazione;
  • la Field Table è vuota, poiché le interfacce non possono avere field istanza ( e non possono essere istanziate );
  • le locazioni per i campi di classe contengono i valori delle eventuali costanti di classe che l'interfaccia ha dichiarato.

Osserviamo infine che le informazioni relative alla Class Structure vengono caricate nella Method Area da parte del Class Manager, e che per la Class Structure, una volta caricata, non è prevista la possibiltà di effettuare un processo di "unload", per cui essa resterà nella Method Area fino all'arresto della Macchina Astratta.

 Prev   Top   Next