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
risposta
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.
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.
Heap, poiché le interfacce esistono solo come implementazioni nelle classi e sono nell'heap. – Hiru
Questo è puramente informativo o stai cercando di ottenere qualcosa? –
Dipende dalla JVM perché le specifiche JVM non dicono come dovrebbe essere organizzata la memoria ... – assylias