Ho scritto un piccolo programma java che carica i dati dal database DB2 utilizzando una semplice chiamata JDBC. Sto usando una query di selezione per ottenere dati e usando l'istruzione java per questo scopo. Ho degli oggetti di istruzione e connessione correttamente chiusi. Sto usando JVM a 64 bit per la compilazione e per l'esecuzione del programma.Perché la mia chiamata JDBC sta consumando memoria 4 volte di più delle dimensioni effettive dei dati
La query restituisce 52 milioni di record, ogni riga con 24 colonne, che richiede circa 4 minuti per caricare i dati completi in Unix (con ambiente multiprocessore). Sto usando HashMap come struttura dati per caricare i dati: Map<String, Map<String, GridTradeStatus>>
. Il bean GridTradeStatus è un semplice bean getter/setter con 24 proprietà.
La memoria richiesta per il programma è allarmante. Le dimensioni dell'heap Java aumentano fino a 5,8 - 6 GB per caricare i dati completi mentre la dimensione effettiva dell'heap utilizzata rimane tra 4,7 - 4,9 GB. So che non dovremmo caricare tanti dati in memoria, ma i miei requisiti aziendali sono solo in questo modo.
La domanda è che quando inserisco interi dati del mio tavolo in un file flat risulta essere approssimativamente equivalente a ~ 1,2 GB. Voglio sapere perché il mio programma java sta consumando memoria 4 volte di più delle sue dimensioni reali.
Le stringhe in java utilizzano UTF-16, che significa 2 byte per ogni carattere. In questo modo si duplica l'utilizzo della ram se il file txt è una normale codifica a 8 bit/char. Inoltre, se si utilizza il metodo substring, ricordare che la stringa originale newer viene liberata, purché l'oggetto substring sia attivo. – MTilsted
Grazie per il tuo commento. È in qualche modo possibile indirizzare JVM all'uso della codifica UTF-8? –
Non direttamente. java.lang.String userà sempre UTF-16. Ma sono sicuro che una ricerca su google può darti una classe di stringa java, che usa utf-8 o un'altra codifica a 8 bit. – MTilsted