Lim
16-01-2012, 17:17
Salve a tutti.
Ho scritto anche qualche giorno fa relativamente alla creazione di più thread e ai relativi problemi di concorrenza.
Ora ho un nuovo problema che si verifica soltanto su una particolare configurazione HW.
Ho realizzato una applicazione in Java che deve manipolare un elevato numero di oggetti (centinaia di migliaia) ad ogni istante di tempo discreto.
Per ridurre i tempi di elaborazione ho suddiviso la mole di lavoro su più thread.
Ho testato l'attuale versione su alcune macchine virtuali quad-core con 8-10GB di ram e su un server dedicato con 32 core e 128GB di ram.
Sulle macchine virtuali nessun problema, ma nel server più potente ricevo un nullPointerException nel run() dei thread istanziati (sempre nello stesso run). In realtà non dovrebbe mai verificarsi una eventualità del genere, perché ho messo dei controlli prima e dopo la creazione dei singoli thread per verificare che l'oggetto esista prima di elaborarlo all'interno del run(), ed in effetti nelle VM più piccole tutto procede correttamente.
Dopo un pomeriggio perso nella ricerca del problema, ho cominciato a pensare ad un problema HW. Premetto che il programma viene avviato passandogli i seguenti parametri:
java -jar -Xmx120000M -Xms120000M -XX:+UseTLAB -XX:NewRatio=1 mioProgramma.jar
Ovviamente nelle altre VM predispongo una dimensione per lo heap più piccola.
Avendo 128GB di ram ho pensato di allocare una dimensione massima di 120GB, ma si genera l'eccezione. Andando a tentativi l'ho ridotta fino a 20GB e dopo svariati minuti ancora non c'è traccia dell'eccezione, che prontamente si ripresenta per valori superiori a 25GB.
Il server utilizza Ubuntu Server 10.10 e java 1.7.0, mentre le VM hanno una versione di ubuntu server leggermente più vecchia e Java 1.6.0_24.
C'è per caso un limite al massimo valore dello HEAP che posso specificare alla JVM? (ovviamente sto utilizzando S.O. a 64 bit).
Eppure in passato non mi aveva dato problemi un valore prossimo a 120GB... :rolleyes:
Potrebbero esserci altre ragioni che sto trascurando?
Ho scritto anche qualche giorno fa relativamente alla creazione di più thread e ai relativi problemi di concorrenza.
Ora ho un nuovo problema che si verifica soltanto su una particolare configurazione HW.
Ho realizzato una applicazione in Java che deve manipolare un elevato numero di oggetti (centinaia di migliaia) ad ogni istante di tempo discreto.
Per ridurre i tempi di elaborazione ho suddiviso la mole di lavoro su più thread.
Ho testato l'attuale versione su alcune macchine virtuali quad-core con 8-10GB di ram e su un server dedicato con 32 core e 128GB di ram.
Sulle macchine virtuali nessun problema, ma nel server più potente ricevo un nullPointerException nel run() dei thread istanziati (sempre nello stesso run). In realtà non dovrebbe mai verificarsi una eventualità del genere, perché ho messo dei controlli prima e dopo la creazione dei singoli thread per verificare che l'oggetto esista prima di elaborarlo all'interno del run(), ed in effetti nelle VM più piccole tutto procede correttamente.
Dopo un pomeriggio perso nella ricerca del problema, ho cominciato a pensare ad un problema HW. Premetto che il programma viene avviato passandogli i seguenti parametri:
java -jar -Xmx120000M -Xms120000M -XX:+UseTLAB -XX:NewRatio=1 mioProgramma.jar
Ovviamente nelle altre VM predispongo una dimensione per lo heap più piccola.
Avendo 128GB di ram ho pensato di allocare una dimensione massima di 120GB, ma si genera l'eccezione. Andando a tentativi l'ho ridotta fino a 20GB e dopo svariati minuti ancora non c'è traccia dell'eccezione, che prontamente si ripresenta per valori superiori a 25GB.
Il server utilizza Ubuntu Server 10.10 e java 1.7.0, mentre le VM hanno una versione di ubuntu server leggermente più vecchia e Java 1.6.0_24.
C'è per caso un limite al massimo valore dello HEAP che posso specificare alla JVM? (ovviamente sto utilizzando S.O. a 64 bit).
Eppure in passato non mi aveva dato problemi un valore prossimo a 120GB... :rolleyes:
Potrebbero esserci altre ragioni che sto trascurando?