Domanda

Sono stato di recente leggendo un sacco sui sistemi di allocazione della memoria in Java, e ci sono stati molti dubbi, come ho letto da varie fonti. Ho raccolto i miei concetti, e vorrei chiedere di passare attraverso tutti i punti e commentare su di loro. Sono venuto a sapere che l'allocazione di memoria è JVM specifica, quindi devo dire in anticipo, che la mia domanda è Sun specifica.

  1. Lezioni (caricato dal classloader) andare in una zona speciale sul mucchio: Permanent Generation
  2. Tutte le informazioni relative a una classe come nome della classe, gli array oggetto associato con la classe, oggetti interni utilizzati da JVM (come Java / lang / Object) e le informazioni di ottimizzazione va in area permanente generazione.
  3. Tutte le variabili membro statiche sono tenuti di nuovo sulla zona permanente generazione.
  4. Gli oggetti vanno in un mucchio di diverso: la generazione giovane
  5. C'è una sola copia di ogni metodo per classe, il metodo statico o non statico. Quella copia viene messo nella zona permanente Generation. Per i metodi non statici, tutti i parametri e le variabili locali vanno in pila - e quando v'è una chiamata concreta di tale metodo, si ottiene una nuova pila telaio ad essa associata. Io non sono sicuro di dove sono le variabili locali di un metodo statico vengono memorizzati. Sono sul mucchio di permanente Generation? O semplicemente il loro riferimento è memorizzato nella zona permanente generazione, e la copia reale è da qualche altra parte (Dove?)
  6. Sono anche sicuro dove non il tipo di ritorno di un metodo vengono memorizzati.
  7. Se gli oggetti (nella generazione) deve utilizzare un membro statico (nella generazione permanente), sono dati un riferimento al membro statico && sono dato spazio di memoria sufficiente per memorizzare il tipo di ritorno del metodo, ecc.

Grazie per passare attraverso questo!

È stato utile?

Soluzione

In primo luogo, come dovrebbe essere chiaro a voi da ora che ci sono pochissime persone che possono confermare queste risposte della grande esperienza di prima mano. Pochissime persone hanno lavorato su recenti HotSpot JVM o studiato per la profondità necessaria per conoscere veramente. La maggior parte delle persone qui (me compreso) sono Risposte basate su cose che hanno visto scritto altrove, o ciò che hanno dedotto. Di solito ciò che è scritto qui, o in articoli e pagine web diverse, si basa su altre fonti che possono o non possono essere definitiva. Spesso è semplificata, sbagliato imprecise o semplicemente.

Se si vuole la conferma definitiva delle sue risposte, si ha realmente bisogno di scaricare il codice sorgente OpenJDK ... e fare la propria ricerca con la lettura e la comprensione del codice sorgente. Fare domande su SO, o pesca a strascico attraverso articoli web casuali non è un suono tecnica di ricerca accademica.

Dopo aver detto che ...

  

1) Corsi (caricato dalle classloader) andare in una zona speciale sul mucchio:. Permanente Generation

Per quanto ne so, sì. ( Aggiorna :. Vedi sotto)

  

2) Tutte le informazioni relative a una classe come nome della classe, gli array oggetto associato con la classe, oggetti interni utilizzati da JVM (come Java / lang / Object) e le informazioni di ottimizzazione va in area permanente generazione.

Più o meno, sì. Non sono sicuro di cosa si intende per alcune di queste cose. Sto indovinando che "oggetti interni utilizzati da JVM (come Java / lang / Object)" mezzi JVM-interno descrittori di classe.

  

3) Tutte le variabili membro statiche sono tenuti di nuovo sulla zona permanente generazione.

L'variabili stesse sì. Queste variabili (come tutte le variabili Java) terrà valori sia primitivi o riferimenti a oggetti. Tuttavia, mentre le variabili membro statiche sono in un frame che viene allocata nel mucchio PermGen, gli oggetti / matrici indicati con queste variabili possono essere allocati in qualsiasi mucchio.

  

4) Oggetti andare su un mucchio di diverso: la generazione giovane

Non necessariamente. grandi oggetti possono essere assegnate direttamente nella generazione tenured.

  

5) Non è solo una copia di ogni metodo per classe, il metodo statico o non statico. Quella copia viene messo nella zona permanente generazione.

Supponendo che ci si riferisce al codice del metodo, poi per quanto ne so si. Può essere un po 'più complicato però. Per esempio che il codice può esistere in bytecode e / o forme di codice nativo in tempi diversi durante la vita della JVM.

  

... Per i metodi non statici, tutti i parametri e le variabili locali vanno in pila - e ogni volta che v'è un'invocazione concreta di tale metodo, si ottiene una nuova pila-frame ad esso associati.

Sì.

  

... io non sono sicuro di dove sono le variabili locali di un metodo statico vengono memorizzati. Sono sul mucchio di permanente Generation? O semplicemente il loro riferimento è memorizzato nella zona permanente generazione, e la copia reale è da qualche altra parte (Dove?)

No. Essi vengono memorizzati sullo stack, proprio come le variabili locali nei metodi non statici.

  

6) Sono anche sicuro dove non il tipo di ritorno di un metodo vengono memorizzati.

Se si intende il Valore restituita da una (non-vuoto) chiamata al metodo, allora è sia restituito il camino o in un registro della macchina. Se viene restituito in pila, questo richiede 1 o due parole, a seconda del tipo di ritorno.

  

7) Se gli oggetti (nella giovane generazione) nees per utilizzare un membro statico (nella generazione permanente), sono dati un riferimento al membro statico && sono dato spazio di memoria sufficiente per memorizzare il tipo di ritorno del metodo, ecc.

Questo è imprecisa (o almeno, non si è esprimersi in modo chiaro).

Se qualche metodo accede a una variabile membro statica, ciò si ottiene è un valore primitivo o un oggetto riferimento . Questo può essere assegnato ad un (esistente) variabile locale o parametro assegnato a un membro statico o non statici (esistente), assegnato ad un elemento (esistente) di una matrice allocata in precedenza, o semplicemente usato e scartato.

  • In nessun caso nuovo esigenza di stoccaggio per essere assegnato a contenere un riferimento o un valore di base.

  • Tipicamente, una parola di memoria è tutto ciò che è necessario per memorizzare un riferimento all'oggetto o matrice, e un valore di base occupa tipicamente una o due parole, a seconda della architettura hardware.

  • In nessun caso lo spazio necessario assegnare da parte del chiamante di attendere qualche oggetto / array restituito da un metodo. In Java, oggetti e gli array sono sempre restituiti utilizzando semantica pass-by-value ... ma quel valore che viene restituito è un riferimento all'oggetto o matrice.

Aggiorna

Come di Java 8, lo spazio PermGen è stato sostituito con Metaspace. Per ulteriori informazioni, si prega di fare riferimento a queste risorse:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top