|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 8 ![]() |
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. |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
Dispose() ne libère pas la mémoire
c'est Collect() qui vide la poubelle si on ne fait que des Dispose() alors on a des memory leak
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
mais quelle idée d'utiliser ODBC alors que le pilote dotnet existe
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 8 ![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com