allocation/unallocation buffer curieuses..
Salut à tous, pb simple que j'ai résolu mais j'aimerais comprendre le pourquoi, je vous le soumets.
j'ai un serveur qui écoute sur un port donné et qui launch un thread dédié au channel ouvert le temps de la transaction puis qui disparait. J'avais remarqué une fuite donc j'ai bien regardé mon code mais comme je n'avais rien trouvé ni jamais le temps je l'ai laissé tourner avec un reinit vers les 1 heure du matin mais bon pas satisfaisant du tout donc les vacances sont là pour clarifier le truc, et je trouve mais la raison me semble curieuse.
Le code de lancement du serveur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
public void run()
{
// LISTEN ON PORT ------------------------------------------
String msg = "Server calculation";
boolean hasclient;
try
{
SS = new ServerSocket(nuport);
SS.setSoTimeout(time2wait); // raised a SocketTimeoutException every 500 ms
}
catch (IOException ioe)
{
msg += ": can't listen on port " + Integer.toString(nuport);
Sys.outMSGln(msg);
Sstatus = SRVR_STOPPED;
return;
}
msg += ": listen on port " + Integer.toString(nuport);
Sys.outMSGln(msg);
// RUN MAIN LOOP ------------------------------------------
started = true;
stopserver = false;
Sstatus = SRVR_RUNNING;
Sys.outMSGln(Sname+": main loop started");
hasclient=false;
while (!stopserver)
{
// Wait for a client
while (!hasclient && !stopserver)
{
try
{
Sclient= SS.accept();
hasclient=(Sclient!=null);
}
catch (SocketTimeoutException ste) // exception result from setSoTimeout() function
{
}
catch (IOException ioe)
{
stopserver=true;
}
}
if (stopserver) break;
XCLI CLI=null;
try
{
CLI = new XCLI (this, SS, Sclient);
CLI.start();
}
catch (Exception e)
{
}
}
try { SS.close(); } catch(IOException e) {}
started = false;
Sys.outMSGln(Sname+": main loop stopped");
}
... |
Le code de lancement du client
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class XCLI extends XThreadBase implements KONSTANT
{
final int MAXREAD = 16384;
byte gbuffer[]; // used temporarily by each parameters
public XCLI ( XSERVER Server,
ServerSocket SSserver,
Socket SClient
)
{
super (Server, SSserver, SClient);
gbuffer = new byte[MAXREAD];
}
void run()
{
/**/
doCalculations ();
//gbuffer=null; // if I omit this reset a mem leake appears ??
/** /
doCalculations2 ();
/**/
}
void doCalculations ()
{
// using gbuffer defined/declared above
...
}
void doCalculations2 ()
{
byte lbuffer[] = new byte[MAXREAD];
...
}
protected void finalize()
{
gbuffer=null;// no impact
}
} |
j'ai donc déclaré dans le client un buffer de byte local au thread que j'utilise dans doCalculations() :
1. Si j'utilise doCalculations() la mémoire se bouffe à la vitesse grand v au bout de quelques milliers de connections. En mettant la ligne buffer=null; tout va mieux, en la mettant dans le finalize du thread cela ne régle rien non plus
2. Si j'utilise un buffer local (docalculations2()), tout est au poil d'entrée sans reset de buffer bizarre n'est-il pas ?
Cela voudrait il dire qu'il reste une référence 'vivante' de gbuffer donc du thread alors que la fonction alloue sur la stack le lbuffer, pourtant je n'ai pas de fuite de handle et j'ai mis un compteur de finalize() dans le thread et il y en a autant de créés que de détruits ????
vos avis Messieurs ...