Memoria JVM e serializzazione a zero copia (de)

1

Sto cercando di capire il modello di memoria JVM. In particolare, vorrei capire se sarebbe possibile avere librerie di serializzazione a zero (de), come Cap'n Proto o FlatBuffers . In particolare, queste due librerie hanno un supporto parziale per Java, ma non mi è del tutto chiaro se l'implementazione è zero-copy.

Supponiamo di voler deserializzare qualcosa e che questa regione sarà di sola lettura. Inizierò con una serie di byte contigui, almeno dal punto di vista JVM, anche se capisco che potrebbero non essere contigui a causa del gestore di memoria virtuale (e possibilmente della JVM?). Questo array è da qualche parte nell'heap JVM.

Quello che mi piacerebbe fare è produrre un'istanza di una data classe, in modo tale che l'accesso a un campo di questa classe significhi semplicemente dereferenziare un puntatore a questa matrice, senza dover copiare le singole parti di questa matrice da qualche altra parte.

Questo è fattibile sulla JVM? In caso contrario, quale sarebbe l'optimum? Posso farlo con una singola copia indipendentemente dal layout della classe?

    
posta Andrea 07.10.2014 - 15:09
fonte

1 risposta

3

La JVM non impone alcuna rappresentazione interna specifica per gli oggetti. Il modo in cui gli oggetti sono disposti in memoria è nascosto e non è possibile mappare direttamente un'area di memoria come una matrice su un oggetto o utilizzare puntatori come in C / C ++.

È possibile utilizzare file mappati in memoria ma devi chiamare metodi che restituiscono il byte / int / double ecc. localizzato su uno specifico offset, quindi non è come accesso diretto come in C poiché deve essere instradato attraverso chiamate di metodo e in questo modo è possibile accedere solo ai tipi di dati primitivi.

Analogamente, ci sono librerie che cercano di emulare strutture di dati semplici, come le pseudo-strutture in Javolution. Tuttavia, questo funziona di nuovo solo per tipi di dati semplici. Potresti provare a usare alcuni trucchi con JNI, ma alla fine della giornata finisci sempre con più indirezione rispetto a C - non puoi semplicemente puntare a un'area della memoria e accedervi come un oggetto normale. Questo è in particolare perché i riferimenti agli oggetti non possono essere serializzati direttamente - presi fuori dal contesto di una concreta istanza di esecuzione della JVM, non avrebbero alcun senso.

Quindi se la struttura dei dati è più complessa di un semplice insieme di campi di tipi di dati primitivi, penso che ciò che richiedi non sia possibile sulla JVM. Se sei soddisfatto solo delle primitive, puoi consultare la classe Struct di Javolution

    
risposta data 07.10.2014 - 19:59
fonte

Leggi altre domande sui tag