Stavo imparando di più su threading, e ho creato un piuttosto semplice applicazione WPF con il seguente codice (x64 piattaforma di costruzione)c utilizzo della memoria # filo
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for (var i = 0; i <= 20000; i++)
{
Thread thread = new Thread(Test);
thread.IsBackground = true;
thread.Start();
}
}
public void Test()
{
Thread.Sleep(20000);
}
}
Quando ho eseguito questo codice, procedura richiede circa 560MB di RAM mentre tutti i thread stanno funzionando/dormendo.
su di essa è completato, l'utilizzo di processo è giù per approssimativamente 125 MB di RAM.
La mia domanda è, perché il processo utilizza 125 MB di RAM a quel punto, quando l'applicazione stessa (senza esempio di thread) utilizza solo 30 MB di RAM?
Mantiene alcuni dei thread attivi per eventuale ri/utilizzo o qualcos'altro sta succedendo?
EDIT:
A causa di alcuni suggerimenti su come migliorare questo codice, vorrei sottolineare che non sto chiedendo un modo per migliorare, ma per individuare il motivo di questo comportamento.
EDIT 2:
Questa non è una discussione correlata, ma ho provato un caso con un ampio elenco string
in memoria, e non produce gli stessi risultati. Quando l'elenco era completamente caricato in memoria, ci sono voluti circa 1,3 GB di memoria, ma dopo che l'elenco è stato impostato su NULL
e GC.Collect()
è stato chiamato, l'utilizzo della memoria è sceso a 30 MB come previsto.
Codice:
public partial class MainWindow : Window
{
List<string> stringArray = new List<string>();
public MainWindow()
{
InitializeComponent();
for (var i = 0; i <= 100000000; i++)
{
//Thread thread = new Thread(Test);
//thread.IsBackground = false;
//thread.Start();
stringArray.Add("Some very long string to pump up the memory volume 2 reloaded");
}
stringArray = null;
GC.Collect();
}
}
Quando un thread termina l'oggetto thread diventa idoneo per la raccolta dei rifiuti ad un certo punto imprecisato in futuro. –
Bene per i principianti, a ciascun thread viene assegnato uno stack da 1 MB predefinito, quindi è necessario aggiungere circa 200 MB. – OldProgrammer
@AlexK. , ho provato ad aggiungere 'GC.Collect();' ad ogni completamento del thread, ma sono ancora bloccato a ~ 125 MB di ram, anche se lascio l'app per funzionare per diversi minuti. Non scende mai a ~ 30 MB. – Robert