Newsgroup: it.comp.java
Titolo: Java leaka?

Domanda quasi provocatoria :P
In sostanza, ho una classe con una gui e un thread "worker", che si 
incarica di leggere una mailbox.
Il thread e' strutturato con un banale ciclo
while(true) {
   check();
   sleep();
}
Bene, dopo 3-4 giorni di lavoro continuo... il thread muore! Cioe', 
smette di checkare (me ne rendo conto perche' ad ogni check mi genera 
output in una textarea della gui). Il programma nel suo insieme non e' 
piantato pero', perche' la gui risponde agli eventi, attiva i menu ed 
esegue le relative funzioni.
Dunque... java ha dei leak/problemi noti/varie ed eventuali con thread 
di lunga durata? Come spiego il fatto che si pianti?
Saluti
CarMas

Se fa dei leak di questo tipo, i casi sono due:
 - programma scritto male
 - effettivo baco della jdk :-)
Hai gia' aggiornato all'ultima versione del branch di tua scelta
l'applicativo? Se si, e' il caso di guardare BENE il codice. Se neanche
guardando bene il codice salta fuori nulla che ti insospettisca manda il
tutto alla Sun :-)
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it



è sufficiente che in check() o sleep() venga generata un'eccezione unchecked
(cioè che derivi da RuntimeException), e il thread muore inesorabilmente
lasciando tutti gli altri attivi. Controlla bene il codice, e cerca di
catturare l'output dello stream System.err per riversarlo su file. Da lì
puoi vedere se c'è effettivamente qualche problema.
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
 - 
http://www.xenu.net/
(per rispondere personalmente leva IlDitoDalCulo)

 (cioè che derivi da RuntimeException), e il thread muore inesorabilmente
Domanda:
while(true) {
  try {
   check();
   sleep();
  }
  catch(Exception ex) { ..gestione.. }
}
Il codice in realta' e' fatto cosi', perche' la check() puo' causare 
eccezioni durante il suo funzionamento.
La RuntimeException subclassa Exception, quindi dovrebbe essere 
catturata dal blocco catch e generarmi output (nella gestione c'e' la 
classica System.out.println con il messaggio).
Ma io non ho output.
Non si possono gestire le eccezioni di runtime? Sbaglio qualcosa?
Saluti
CarMas

 guardando bene il codice salta fuori nulla che ti insospettisca 
Eh, come primo passo ipotizzo che il codice abbia dei punti pericolosi.
Intanto ho deciso di realizzare una sorta di watchdog.. Idealmente, 
prima di ogni metodo prendo nota di cosa sto per fare, poi attivo il 
watchdog e quando esco dal metodo lo disattivo. Se viceversa invece 
dovesse scattare, allora ho traccia dell'istruzione che ha causato il 
problema.
Ma non so se servira', questo mi dira' che si e' bloccato in un punto 
che invece in precedenza era gia' stato invocato centinaia di volte.
Dovrei passare il programma ad un profiler?
Saluti
CarMas

 output in una textarea della gui)
Normalmente sviluppo applicazioni web, quindi non ho molta
esperienza nell'uso delle classi Swing (presumo che usi queste
per la tua gui, giusto?).
Prova a verificare se a bloccarsi e' effettivamente il thread "worker"
oppure semplicemente se e' la textarea che non visualizza piu' 
i messaggi di log: se li accodi ogni volta a quelli precedenti, 
il contenuto della textarea potrebbe essere diventato di dimensioni 
eccessive e la gui potrebbe "arrancare" un po'. 
In teoria non mi pare che vi siano limiti esplici definiti dalla
Java Language Specification sulle dimensioni massime delle stringhe,
se non la disponibilita' effettiva di memoria del sistema sul quale 
gira la JVM, ma io una verifica la farei e comunque "loggerei" 
sempre anche su file...
Saluti
Roberto
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

È improbabile che ci siano problemi sui thread a lunga durata.
Nella normale istanza di un programma java ci sono comunque più thread
attivi. Se si fermassero ce ne saremmo accorti. Inoltre programmi come
tomcat,webshere e altri usano molti thread...


No. Il leaking, se c'e', e' probabilmente nel tuo codice.

 CarMas
Quindi check() throws Exception vero? :) La butto lì perchè volte gli 
errori sono così banali che anche uno con esperienza non se ne accorge 
:| Magari poi non centra niente...
Ciao
Ivan

 Quindi check() throws Exception vero?
check() lavora con javamail, quindi ha un throws MessagingException. 
Anche IOException perche' fa operazioni con gli attachment, ma quello 
non e' un problema.. ho messo Exception nella catch per catturare tutto!
Saluti
CarMas

 eccessive e la gui potrebbe "arrancare" un po'. 
Questo e' un aspetto a cui non avevo mai pensato! quanto testo posso 
infilare in una textarea? c'e' un buffer o alloca all'infinito?
Saluti
CarMas

 infilare in una textarea? c'e' un buffer o alloca all'infinito?
Non saprei darti una risposta precisa alla tua domanda.
Io per evitare qualsiasi problema penserei ad una
la soluzione che abbia un log sempre attivo su file,
al quale affiancare (se proprio necessario) l'output su textarea.
La textarea dovrebbe essere automaticamente azzerata
quando le dimensioni del testo in essa contenuto superano 
una soglia prefissata (magari configurabile!).
Le dimensioni del file di log possono essere tenute
sotto controllo utilizzando vari metodi:
- se usi log4j si puo' configurare un "appender"
  che "ruota" automaticamente i log che superano una
  certa dimensione
- sotto *nix si puo' usare logrotate


 }
[CUT]
Prova con "catch (Error e) ..."
Ci sono anche i casi in cui si genera un errore e non un'eccezione. (Out 
of memory, 1/0, ...)
Paolo.

 Come spiego il fatto che si pianti?
Risolto!
Concorso di colpa.
Chi usava il programma aveva impostato un intervallo di check della 
mailbox ad 1 minuto, imho troppo frequente per non finire per farsi 
segare da un mail server. Nel contempo, io che ho fatto il programma non 
ho impostato il timeout della connect, che di default e' ad infinito, 
per cui il thread si bloccava perche' restava sempre in attesa... una 
hung connection insomma.
Grazie a tutti per l'aiuto.
Saluti
CarMas