|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
[Java] Eccezione quando definisco uno HEAP troppo grande
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: Codice:
java -jar -Xmx120000M -Xms120000M -XX:+UseTLAB -XX:NewRatio=1 mioProgramma.jar 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... Potrebbero esserci altre ragioni che sto trascurando? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Al tuo posto proverei ad usare anche sul server più potente lo stesso runtime che usi sulle macchine virtuali (jre 1.6.0_24), tanto per assicurarmi che il problema non è caratterizzato dalla specifica versione in uso del runtime java.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 17-01-2012 alle 08:58. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Quote:
Ho eseguito lo stesso codice anche su una macchina virtuale con Windows7 e jre 1.7.0. Sembra funzionare correttamente, anche allocando un heap di 50 GB (sull'altra macchina si blocca anche per valori superiori a 20GB). Comincio a pensare ad un errore della memoria... Ho lanciato un test della memoria: Codice:
$ dd if=/dev/urandom bs=132296780 of=/tmp/memtest count=1024 $ md5sum /tmp/memtest; md5sum /tmp/memtest; md5sum /tmp/memtest Ancora non è terminato, aspetto... Suggerimenti? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sorry, ma non so nulla di ambienti *nix e server.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Controllato i limiti del sistema operativo? (ulimit)
Magari è impostato in modo diverso tra le macchine.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:18.



















