Memory Leak connection .net - Firebird1.5
Bonjour à tous,
Ayant quelques soucis de memory leak en C#, j'ai utilisé des profiler de mémoires. Ne comprennant pas tout, il me semble que l'utilisation sans cess croissante de memoire virtuelle de mon programme pourrait venir de l'utilisation des driver odbc pour firebird 1.5...
Est-il possible que la fonction Open soit mal gérée.
Pour voir le début de l'histoire et connaitre tous les détails :
http://www.developpez.net/forums/sho...41#post2194541
faut-il passer a Firebird2 ?
En fait je suis perdue, je n'arrive pas à localiser mon problème.
Open/Close => toujours memory leak
Après avoir essayer Collect (qui n'a rien changé) j'ai reduit mon test à la plus simple expression :
je cree un OdbcConnection sur laquelle je fais Open puis Close et que surlaquelle je fais dispose.
La encore j'ai des fuites de memoire...
pb C# (odbc) ou driver firebird ?
Voici mon code :
public void DirectLoopNoThread()
{
Process aProcess = null;
int i = 0;
while (m_bNotStop)
{
OdbcConnection oConn = new OdbcConnection("DSN=CHGT_SECAB");
oConn.Open();
oConn.Close();
//Free Memory ?
oConn.Dispose();
oConn = null;
System.Threading.Thread.Sleep(1000);
i++;
if (i == 50)
{
i=0;
aProcess = Process.GetCurrentProcess();
Trace.WriteLine(DateTime.Now.ToString() + " TestDb :"
+ " VMem=" + aProcess.VirtualMemorySize
+ " PrivateMem=" + aProcess.PrivateMemorySize);
aProcess.Dispose();
aProcess = null;
GC.Collect();//2) ;
aProcess = Process.GetCurrentProcess();
Trace.WriteLine(DateTime.Now.ToString() + " TestDb : GC.Collect");
Trace.WriteLine(DateTime.Now.ToString() + " TestDb :"
+ " VMem=" + aProcess.VirtualMemorySize
+ " PrivateMem=" + aProcess.PrivateMemorySize);
aProcess.Dispose();
aProcess = null;
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1) ;
aProcess = Process.GetCurrentProcess();
Trace.WriteLine(DateTime.Now.ToString() + " TestDb : GC.SetProcessWorkingSetSize");
Trace.WriteLine(DateTime.Now.ToString() + " TestDb :"
+ " VMem=" + aProcess.VirtualMemorySize
+ " PrivateMem=" + aProcess.PrivateMemorySize);
aProcess.Dispose();
aProcess = null;
}
}
}
Voici les traces obtenues :
====================
18/06/2007 09:48:50 TestDb : DirectLoopNoThread
18/06/2007 09:49:41 TestDb : VMem=179871744 PrivateMem=12541952
18/06/2007 09:49:43 TestDb : GC.Collect
18/06/2007 09:49:43 TestDb : VMem=179871744 PrivateMem=12673024
18/06/2007 09:49:43 TestDb : GC.SetProcessWorkingSetSize
18/06/2007 09:49:43 TestDb : VMem=179871744 PrivateMem=12673024
18/06/2007 09:51:26 TestDb : VMem=288923648 PrivateMem=15372288
18/06/2007 09:51:26 TestDb : GC.Collect
18/06/2007 09:51:26 TestDb : VMem=288923648 PrivateMem=15372288
18/06/2007 09:51:26 TestDb : GC.SetProcessWorkingSetSize
18/06/2007 09:51:26 TestDb : VMem=288923648 PrivateMem=15372288
" dll ou pilote firebird .net
Parce que nous n'étions pas sûrs il y a 1 an de travailler avec Firebird ;)
Nous voulions pouvoir changer de base de données sans avoir à tout modifier dans le code.
Aujourd'hui, nous sommes convaincus par Firebird, il serait possible d'utiliser directement votre pilote.
Si ca resoud mes problèmes. je fonce.