2015-06-15 11 views
11

Qual è la differenza tra classe astratta e interfaccia in termini di archiviazione in JVM. Per essere più preciso in cui JVM memorizza le interfacce nella sua memoria?Qual è la differenza tra classe astratta e interfaccia in termini di archiviazione in JVM

+0

Heap, poiché le interfacce esistono solo come implementazioni nelle classi e sono nell'heap. – Hiru

+1

Questo è puramente informativo o stai cercando di ottenere qualcosa? –

+0

Dipende dalla JVM perché le specifiche JVM non dicono come dovrebbe essere organizzata la memoria ... – assylias

risposta

7

Avviso: Come menzionato da @assylias, questa meccanica è specifica per Oracle HotSpot JVM.

Prima Java8

Tutte le informazioni sono memorizzate in meta PermGen, per entrambe le classi astratte e le interfacce. Le informazioni sulla meta includono solo informazioni specifiche della classe (quali campi ha, cosa è padre, ecc.).

L'interfaccia può contenere solo i campi public static final, quindi questa informazione sul campo è memorizzata in PermGen.

La classe astratta può avere campi sia statici che non statici. Tuttavia, non vi è alcuna differenza in termini di meta-informazioni, quindi è anche memorizzata in PermGen. D'altra parte, le istanze di oggetti reali sono memorizzate in Heap per i campi sia statici che non statici.

vedere l'esempio

public class MyClass { 
    public static final Calendar calendar = Calendar.getInstance(); 
    private Date myDate = new Date(); 
} 

informazioni Campo su calendar e myDate è memorizzato in PermGen e casi reali di oggetti vengono memorizzati in Heap.

In Java8 PermGen è stato spostato all'interno dello spazio Mucchio, nella cosiddetta Metaspace, in modo che non si veda più java.lang.OutOfMemoryError: PermGen space. Tuttavia, la separazione concettuale tra meta-informazione e memoria di allocazione degli oggetti è ancora presente.

Rivedere anche la quotazione delle specifiche @AlexTaylor.

+0

Come commentato, questo è dipendente da JVM - ad esempio, ciò che affermi non può essere corretto per hostpot/Java 8 perché non c'è più un Permgen ... – assylias

+0

è ancora specifico per l'hotspot JVM. – assylias

6

Il method area (logicamente parte del mucchio) memorizza un sacco di informazioni su classi e interfacce nella JVM:

... Strutture negozi per-classe, come il run-time pool di costanti, campo e dati di metodo e il codice per metodi e costruttori, inclusi i metodi speciali (§2.9) utilizzati nell'inizializzazione di classe e istanza e l'inizializzazione dell'interfaccia.

Tuttavia:

Questa specificazione non mandato l'ubicazione della zona di metodo o i criteri utilizzati per gestire il codice compilato.

Ciò significa che una particolare JVM è libera di memorizzarli ovunque sia opportuno.

Problemi correlati