IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[HARD] Memory ramassage


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut [HARD] Memory ramassage
    Bonjour

    j'aimerais juste comprendre comment wpf libere la memoire des object visuel
    en effet dans le projet ci joint
    - au depart j'ai 48mo
    - quand je crée les object (create) : 147
    - je libere (Clear) puis je fais un GC.Collect() (collect) : 116

    ce que je ne comprend pas c'est qu'il ne ramasse pas tout pour arriver a quelque chose de proche du depart
    quand je control je vois que j'ai encore

    System.Windows.Documents.TextStore, 3000, 324000, 396000
    System.Runtime.CompilerServices.ConditionalWeakTable+Entry<System.Object, System.Object>[], 3012, 289152, 289152

    qui correspondent au 3000 objects que j'ai crée et qui on un data template...

    quelqu'un a une idée pour forcer wpf a ramasser le tout (quand on veut)


    merci
    Fichiers attachés Fichiers attachés
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Points : 62
    Points
    62
    Par défaut
    Proposition de solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            private void Button_Clear(object sender, RoutedEventArgs e)
            {
                Collection.Clear();
                _Collection = null;
            }
    Cela forcera à décrocher l'objet pour que le Garbage puisse faire son travail.
    Cela donne, pour moi, en charge mémoire :
    - au départ j'ai 26mo
    - quand je crée les object (create) : 128Mo
    - je libère (Clear) puis je fais un GC.Collect() (collect) : 43Mo

    On n'arrive pas encore au 26mo du début, mais on s'en rapproche comme ça.
    A voir si c'est pas plus intéressant de faire cela en ajoutant l'accesseur "set" sur Collection, et de travailler avec lui et non sa variable privée (_Collection qui est public dans ton code).


    Si tu utilises le Garbage toi même, il est conseillé d'utiliser (mais cela ne résoudra pas ton problème) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	   
    GC.Collect();
    GC.WaitForPendingFinalizers();
    

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait
    ca ramasse pas vraiment
    j'ai constaté que c'etait lié a la mémoire non managé utilisé par wpf et non libérée
    bref je sais pas trop comment faire
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Je vous invite à lire l'article sur le fonctionnement du ramasse-miettes que j'ai écrit et qui est disponible ici : http://fdorin.developpez.com/tutorie...amasse-miette/ afin de bien comprendre pourquoi il faut supprimer la référence à la collection _Collection.

    De plus, PrivateMemorySize64 ne retourne pas la mémoire actuellement utilisée, mais la mémoire allouée au processus. C'est à dire que si le processus à eu besoin de 100Mo à un instant donné, mais qu'il n'en utilise plus que 20Mo, la valeur sera de 100 et non de 20, faisant croire à un problème de libération de la mémoire.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    il faut utiliser quoi pour connaitre la taille réellement utilisée ?

    j'ai traqué la mémoire avec dotmemory, ce que je constate c'est que la mémoire non managée n'est pas correctement libérée, vu que j'utilise wpf je peux pas être complètement responsable de la création... si mes objets sont effectivement libérés, ceux initiés par la couche wpf ne le sont manifestement pas ...

    j'ai amélioré mon soft pour montrer le problème
    utilisation :
    - choisir le mode
    • simple : objet sans relation
    • parent : object avec reference sur la fenetre
    • message : object avec += sur un message de l'objet
    • parent + message : les deux du dessus

    - cliquer sur run
    il va faire 50 itérations de
    • création de 3000 objects
    • link to list
    • liberation
    • etc

    a la première itération complète on position une ligne rouge qui indique ou se trouve la mémoire ...

    ca prend entre 0h30 et 1h30
    a faire deux fois en arrêtant entre les deux pour que ce soit significatif

    le logiciel possède un petit grapheur automatique (comme performance du taskmanager) ça peut servir
    Fichiers attachés Fichiers attachés
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    [QUOTE=ikeas;9937712]il faut utiliser quoi pour connaitre la taille réellement utilisée ?/QUOTE
    A ma connaissance, ce n'est pas possible.

    Citation Envoyé par ikeas Voir le message
    j'ai traqué la mémoire avec dotmemory, ce que je constate c'est que la mémoire non managée n'est pas correctement libérée
    Encore une fois, non. Pour être plus précis, la mémoire est libérée au niveau du processus en lui-même, pas au niveau de l'OS. C'est-à-dire que le processus peut allouer de la mémoire sans avoir à en demander à nouveau à l'OS. C'est pour cela que la valeur retournée par PrivateMemorySize64 ne convient pas.

    Pour s'en convaincre, il suffit de faire tourner le programme (le premier, je n'ai pas testé le second), en faisant des cycles de
    • create ;
    • clear ;
    • collect ;
    • collect ;
    • collect (cf. mon article pour comprendre pourquoi il faut appeler plusieurs fois la collecte) ;


    J'ai répété le cycle une dizaine de fois, et la mémoire oscillait entre 50 et 55mo. Donc, après une première allocation (avec demande à l'OS, d'où le passage de 20 à 50), les autres peuvent se faire sans soucis (d'où la stagnation).

    Et pour éviter toute blague, à faire en mode release en dehors de tout débogage (la présence d'un débogueur peut influer sur la durée de vie des objets).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    tente la solution avec le run

    a la fin il fait des collect tout le temps mais on arrive jamais a redescendre au niveau initial

    quand j'utilise mon véritable programme même après verification et des collects par milliers je monte facilement a 2/3go ...
    pourtant tous mes objets .net sont correctement libérés
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    j'ai fait 2x create puis clear, les 2x je suis retombé à 72Mo utilisé (après montée à ~ 300 Mo)

    tu as bien compilé en release ? car en debug y a des liens qui restent, pour justement faire du debug ...

    au passage doevents est interdit depuis 2005
    et c'est pas super performant vu qu'on se prend un gros freeze à chaque clic (edit : ca vient en partie du virtualizingstackpanel = false ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    je vais essayer en release

    bon pour ce qui est du doevents c'est une version propre a wpf qui desempile les messages lol
    et c'etait juste pour voir que ca bouge mais dans le reel ca n'aurait pas un grand interet
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    Pas mieux en release
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  11. #11
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ikeas Voir le message
    Pas mieux en release
    Attention, en release et sans débogage.

    Sinon, je viens de faire un test. J'ai juste fait quelques modifications :
    • je garde la même collection d'une itération à l'autre :
    • j'appelle plusieurs fois de suite le ramasse-miette lors d'un clean ;
    • modification du nombre d'itérations de 50 à 20 (parce que j'ai autre chose à faire que d'attendre).


    Bilan des courses en mode message+parent+debug+débogage: ligne rouge à 124, et à la fin, ligne orange à 124. Durant les différentes itérations, j'ai bien vu la mémoire augmenter, mais vraiment très très légèrement (genre quelques Mo tout au plus). Je n'ai pas du dépasser les 500Mo au pire du pic. Et à la fin, c'est redescendu au bon niveau. Donc pour moi, tout est ok.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    tu peux renvoyer le projet stp ...
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  13. #13
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Runtime;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
     
    namespace TEST_MEMORY
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public MainWindow()
            {
                InitializeComponent();
     
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = new TimeSpan(0, 0, 1);
                EventHandler tick = (ss, ee) =>
                {
                    Process currentProc = Process.GetCurrentProcess();
                    long value = currentProc.PrivateMemorySize64;
                    long v = ((value / 1000) / 1000);
                    this.mem.Text = v.ToString();
                    this.PART_Graph.Add(v);
                };
                timer.Tick += tick;
                tick(null, null);
                timer.Start();
                Button_Click(null, null);
     
            }
     
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += bw_DoWork;
                bw.RunWorkerAsync();
            }
     
            void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                while (true)
                {
                    //GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
                    //GC.Collect(2);
                    //GC.Collect(1);
                    GC.Collect();
                    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
                    GC.WaitForPendingFinalizers();
                    Thread.Sleep(500);
                }
            }
     
            #region Mode
            private ObservableCollection<String> _Mode = null;
            public ObservableCollection<String> Mode
            {
                get {
                    if (_Mode == null)
                    {
                        _Mode = new ObservableCollection<string>();
                        _Mode.Add("Simple");
                        _Mode.Add("Parent");
                        _Mode.Add("Message");
                        _Mode.Add("Message+parent");
                    }
                    return _Mode; 
                }
            }
            #endregion
     
            #region SelectedIndex
            private int _SelectedIndex = 0;
            public int SelectedIndex
            {
                get { return _SelectedIndex; }
                set { _SelectedIndex = value; OnPropertyChanged("SelectedIndex"); }
            }
            #endregion
     
     
            private void Button_Create(object sender, RoutedEventArgs e)
            {
                if (Collection == null)
                {
                    Collection = new ObservableCollection<object>();
                }
     
                this.PART_Rec.Visibility = Visibility.Visible;
                App.DoEvents();
                for (int i = 0; i < 9000; i++)
                {
                    Toto t = null;
                    // simple
                    if (SelectedIndex == 0)
                    {
                        t = new Toto { Name = "alpha " + i };
                    }
                    // parent
                    else if (SelectedIndex == 1)
                    {
                        t = new Toto { Name = "alpha " + i, Parent = this };
                    }
                    // message
                    else if (SelectedIndex == 2)
                    {
                        t = new Toto { Name = "alpha " + i };
                        t.Changed += t_Changed;
                    }
                    // message + parent
                    else if (SelectedIndex == 3)
                    {
                        t = new Toto { Name = "alpha " + i, Parent = this };
                        t.Changed += t_Changed;
                    }
                    Collection.Add(t);
                }
                this.PART_Rec.Visibility = Visibility.Hidden;
                App.DoEvents();
            }
     
            void t_Changed(object sender, EventArgs e)
            {
            }
     
            public ObservableCollection<Object> _Collection = null;
            public ObservableCollection<Object> Collection
            {
                get { return _Collection; }
                private set { _Collection = value; OnPropertyChanged("Collection"); }
            }
     
            private void Button_Clear(object sender, RoutedEventArgs e)
            {
                Collection.Clear();
                //Collection = null;
            }
            Random r = new Random();
            private void Button_Add(object sender, RoutedEventArgs e)
            {
                double v = r.Next(300);
                this.PART_Graph.Add(v);
            }
     
            private void Button_Fixe(object sender, RoutedEventArgs e)
            {
                this.PART_Graph.Fixed();
                this.fixe.Text = this.mem.Text;
            }
     
            private void Button_Unfixe(object sender, RoutedEventArgs e)
            {
                this.PART_Graph.Unfixed();
                this.fixe.Text = "---";
            }
     
            Stopwatch sw = new Stopwatch();
            private void Button_Run(object sender, RoutedEventArgs e)
            {
                sw.Reset();
                sw.Start();
                this.IsEnabled = false;
                App.DoEvents();
                TH(5);
                for (int i = 0; i < 20; i++)
                {
                    this.info.Text = "Iteration : " + (i + 1);
                    App.DoEvents();
                    Button_Create(null, null);
                    TH(2);
                    Button_Clear(null, null);
                    Button_Clear(null, null);
                    Button_Clear(null, null);
                    TH(5);
                    if (i == 0)
                    {
                        Button_Fixe(null, null);
                    }
                }
                // attente stabilisation
                TH(60);
                sw.Stop();
                this.time.Text = sw.Elapsed.ToString();
                this.IsEnabled = true;
            }
     
            private void TH(long sleepInSec)
            {
                for (int i = 0; i < sleepInSec * 10; i++)
                {
                    Thread.Sleep(100);
                    this.time.Text = sw.Elapsed.ToString();
                    App.DoEvents();
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
     
     
        public class Toto
        {
            public event EventHandler Changed;
     
            public string Name { get; set; }
            public object Parent { get; set; }
            public override string ToString()
            {
                return Name;
            }
        }
    }
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    bon pour 50 itérations
    • en release : debut 89 -> fin 94
    • Debug : debut 89 -> fin 94

    je vais voir avec Microsoft pour savoir pourquoi ça libère pas tout
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  15. #15
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Quand j'ai fait le test, j'étais à 89 au début, et 88 à la fin !

    Franchement, je persiste à penser que tu fais fausse route. Si la mémoire est si importante que ça, alors la technologie choisie n'est pas la bonne. Un langage avec ramasse-miettes n'est pas fait pour gérer la mémoire manuellement comme tu le souhaites, mais justement pour ne pas la gérer. Cela ne veut pas dire qu'il faut faire n'importe quoi avec (il faut bien ne plus référencer les objets devenus inutiles), mais qu'il ne faut pas chercher à récupérer immédiatement la mémoire allouée.

    De plus, il peut très bien y avoir des mécanismes faisant qu'un objet plus référencé par ton code soit encore référencé par le framework WPF (et donc non collectable). Comme la grande majeure des frameworks graphiques, je suppose que WPF est basé sur un système de message pour gérer les interactions. Il est donc tout à fait possible que le nettoyage prenne un peu de temps avant qu'il ne soit complet. Je n'ai pas la conso de l'appli une fois les run juste finie. Je n'ai la consommation de l'appli qu'une fois le run terminé depuis quelques minutes déjà (ben oui, je ne suis pas resté devant l'application, je faisais autre chose en attendant). Quand j'ai regardé la consommation de mémoire à ce moment, tout était ok. Donc pour moi, il n'y a pas de soucis.

    De plus, en tentant de forcer la libération de la mémoire manuellement, tu as de grande chance de plomber les performances de ton application.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    perso j'ai jamais vraiment réussi a retomber sur la valeur initiale dans le logiciel

    ce que je ne comprends vraiment pas c'est que la mémoire consommé l'est par l'utilisation du datatemplate sur Toto
    donc quelque chose qui échappe complètement a ce que moi je produis....

    je peux comprendre qu'il faille du temps pour ramasser la mémoire mais même en attendant beaucoup ça passe pas ....

    le pire que j'ai actuellement c'est que si je lance sans arrêter les itérations j'ai un overflow memory vers les 260 itérations (877 mega sur le logiciel et 1,337 go sur le task manager)

    je veux bien comprendre que dans ce cas il ait pas le temps de ramasser la mémoire, mais c'est étonnant qu'il ne la recycle pas non plus
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

Discussions similaires

  1. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  2. Réponses: 7
    Dernier message: 26/02/2004, 09h32
  3. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03
  4. Problème avec memory mapping
    Par gemai dans le forum C
    Réponses: 13
    Dernier message: 04/07/2003, 09h50
  5. Memory fault(coredump)
    Par nono1 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2002, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo