Java Object [] e cache strading


Come sappiamo quando la memoria viene spostata nelle cache L sulla cpu viene spostata con le cacheline, quindi l'intera ottimizzazione delle prestazioni della cache...

Bene in java quando definiamo un array jmm garantisce che la memoria per ogni elemento verrà allocata in sequenza. Tuttavia, se abbiamo una serie di riferimenti, tali riferimenti possono puntare in modo casuale a luoghi diversi nella memoria.

La mia domanda è che java alloca la memoria degli oggetti reali in sequenza? Quali ottimizzazioni abbiamo sotto il cofano per questo?

Ad esempio se dichiariamo int [] siamo sicuri che siano tutti effettivamente sequenziali in memoria, ma se definiamo un NewType (come struct) che ha due campi int in esso, e dichiariamo NewType [] java capirà e manterrà la memoria effettiva in sequenza o no?

Author: vach, 2015-06-27

2 answers

La mia domanda è java alloca la memoria degli oggetti reali in sequenza?

Questo non è garantito, ma la maggior parte delle volte la JVM OpenJDK/Oracle lo fa. Alcune volte non lo sono;

  • quando si assegna un oggetto di grandi dimensioni nello spazio di ruolo,
  • il tuo TLAB è pieno e devi prenderne un altro.

Tuttavia, all'interno del TLAB, alloca solo sequenzialmente in memoria.

Declare NewType [] java capirà e manterrà memoria effettiva in sequenza o no?

Java non capisce nulla, né esce dal suo modo di allocare gli oggetti in modo casuale in memoria. In generale, ogni oggetto new sarà immediatamente dopo l'ultimo.

 3
Author: Peter Lawrey, 2015-06-27 15:42:10

Ma se definiamo un NewType (come struct) che ha due campi int in esso, e dichiariamo NewType[] java capirà e manterrà la memoria effettiva in sequenza o no?

In questo scenario java non è molto cache-friendly perché a parte i tipi primitivi array java non sono strutture di dati imballati, sono array di riferimenti che puntano a oggetti allocati altrove in memoria.

Cioè ci sarà almeno un livello di indirizzamento indiretto dall'array all'oggetto stesso. Questo problema è spesso definito come "pointer chasing".

Cioè di solito il layout della memoria sarà simile a questo:

HlRRRRRRRRRRRRRRRRRRRRRRRRR0HR0iii0HR0iii0HR0iii0HR0iii0HR0iii0HR0iii0HR0iii0
         Array             | Obj  | Obj  | Obj  | Obj  | Obj  | Obj  | Obj  |

H = object header
l = array length
R = reference
i = int
0 = various types of padding

È possibile utilizzare jol per ispezionare il layout di memoria degli oggetti.

Gli sviluppatori di JDK stanno lavorando su Tipi di valorecome parte di progetto valhallache alla fine consentirà l'esistenza di array imballati, che potrebbero essere necessari come parte di progetto panama, ma questo è ancora lontano nel futuro.

Nel frattempo ci sono progetti 3rd-party mirano a fornire caratteristiche simili:

Altri progetti utilizzano storage off-heap (ad esempio tramite sun.misc.Unsafe) o viste su array ByteBuffer / byte[] per creare strutture dati impacchettate e compatibili con la cache a scapito di API più complicate.

 1
Author: the8472, 2015-06-27 18:42:23