Newsgroup: it.comp.java
Titolo: Pulizia Thread.

Ho un processo server che accetta di continuo rechieste da vari client
(circa 15000 richieste giornaliere).
Per ciascuna richiesta mi creo una nuova istanza di una classe Thread.
Il thread muore quando il metodo run () restituisce il controllo (in
piu' ho inserito un metodo finalize () di pulizia).
Richiamo anche il metodo gc() dopo 5000 richieste, ma mi rendo conto che
la memoria occupata cresce di continuo. 
Premetto che lancio l'interprete java con il parametro oss (set the
maximum Java stack size for any thread) settato a 8 k.
Lavoro su HP-UX facendo un 'top' vedo che i parametri 'SIZE' (Total size
of the process in kilobytes.This includes text, data, and stack.) e
'RES' ( Resident size of the process in kilobytes.The resident size
information is, at best,an approximate value.) crescono continuamente
anche dopo il gc.
A livello di codice ho una cosa del genere :
while (true)
{ 
....try
	{              
	             new SmpdmCLIThread(clientSocket).start(); 
	}     catch (OutOfMemoryError oe) {          
	             System.gc();
	           } 
	..after 5000 request System.gc();
}	
Ho avuto problemi di memoria (core ) dopo circa 4000 richieste settando
il parametro oss a 4 k.
Problemi di questo tipo
SIGSEGV   11*  segmentation violation
Sig = 11; code = 0.
        stackbase=79CCD000, stackpointer=79CCEAB8
Full thread dump:
    "Thread-4476" (TID:0x7a2983c8, sys_thread_t:0x79ccd000, state:R,
monitor_wait:0x0) prio=5 *current thread*
        SmpdmCLIThread.run(Compiled Code)
    "Thread-4475" (TID:0x7a298428, sys_thread_t:0x79cee000, state:MW,
monitor_wait:0x400037cc) prio=5
        smpdm_cli.imc_ch_sdm_hand(Compiled Code)
        SmpdmCLIThread.run(Compiled Code)
.....
Ho riportato il valore oss a 8 k, ma non vorrei succedesse la stessa
cosa.
Non vorrei che il Thread non 'morisse' effettivamente cioe' rimanesse
una sua traccia da qualche parte.
"Quando un Thread muore tutte le risorse da esso utilizzate diventano
disponibili per il recupero da parte del garbage collector se in nessuna
altra parte vi sono riferimenti a queste risorse."
  Ma con questo cosa si intende per riferimento ?
il fatto che io ho un ciclo infinito con un  " new
SmpdmCLIThread(clientSocket).start(); " e' un riferimento ?
Ringrazio in anticipo chi mi risponde
 
	Francesco
--
Posted from 
tlvsdy.vim.tlt.alcatel.it
 [151.98.8.244]
via Mailgate.ORG Server - 
http://www.mailgate.org

 
No.
Per quanto riguarda i riferimenti, hm, la domanda e' un filo ..strana! In ogni
caso, per riferimento si intende *esattamente* il signficato standard del 
linguaggio: quando fai una new, e assegni il risultato a una variabile - tale
variabile e' un "riferimento" - un buon vecchio puntatore, senza accesso diretto
alla memoria o visibilita' sugli indirizzi. Ad esempio in:
MyObj a = new MyObj();
MyObj b = a;
a e b sono due riferimenti allo stesso oggetto - "puntano" alla stessa zona di 
memoria, a cui puoi accedere indifferentemente usando uno o l'altro; si chiamano
"riferimenti" proprio perche' ti permettono di "riferirti a" un oggetto.
Ora, finche' esiste in scope un riferimento ad un oggetto (ovvero, puoi "nominare"
l'oggetto, chiedendogli un servizio o accedendo ai suoi membri), gc non lo tocchera';
quando invece *tutti* i riferimenti ad un oggetto vanno fuori scope - l'oggetto
e' marcato "garbage" ed e' candidato a essere eliminato da gc.
Scusa la verbosita', ma non vedo cos'altro si possa dire sui riferimenti; tradotto
in pratica, significa che se nel tuo programma c'e' qualche oggetto che possiede un
thread - questo non sara' garbage finche' anche l'oggetto possessore non lo diventi,
etc.
Nota anche che gc ha una priorita' piuttosto bassa - e il tuo ciclo si pappa
una buona porzione di cpu-time nel ciclo di lancio dei tuoi n-mila thread.. io 
metterei un Thread.sleep(xx) o Thread.yield() all'interno del ciclo per lasciare 
un po' "d'aria" ai thread accessori - come gc. Verifica con un profiling il tempo
di cpu per il thread che contiene il ciclo.
L'ultima possibilita' e' che - dati i requisiti di carico cosi' alti (ma 15000
richieste al giorno ~= 1875 richieste all'ora ~= 31.25 al minuto - perche' allochi
5000 thread? Costruisci un pool di un centinaio di thread e pesca da li'! :) ) tu
*non* abbia effettivamente memoria sufficiente per gestire il carico, per lo meno
nei momenti di picco.
Saluti,
	Cris

 di analogo nell'implementazione HP.
Hai proprio ragione ho trovato quanto segue nel sito dell 'HP
..
JavaSoft ID 4102107: In JDK 1.1.5, information about a thread was not
 discarded when the thread died. This resulted in severe memory leaks in
 programs that created and destroyed large numbers of threads.
Dovro' cambiare quindi cambiare versione del JDK.
Grazie comunque del consiglio e auguri.


Dovro' cambiare quindi cambiare versione del JDK.
Io dovro migrare la mia applicazione java da PC attuale a HP
Unix...Java in questo caso non mi da problemi (e' Java !) il problema
sono i db e l'interfaccia dovrei usare Oracle.....qualche idea...? 
Se vi va contattatemi, potremmo aiutarci...se invece sono OT grazie e
Auguri :-)
