Ist es für einen Programmierer möglich, programmgesteuert die Garbage Collection in der Programmiersprache C# zu starten/stoppen? Zum Beispiel für die Leistungsoptimierung und so weiter.Ist es möglich, die .NET-Garbage Collection zu stoppen?
Antwort
Nicht wirklich. Sie können die GC
Hinweise über Methoden wie GC.AddMemoryPressure
oder GC.RemoveMemoryPressure
geben, aber nicht sofort aufhören.
Außerdem ist Garbage Collection nicht so intensiv von einem Prozess. Programmierer kümmern sich sehr selten darum.
Oh, ich sehe ... Wie wäre es mit der SuppressFinalize() Methode? Hat es einen anderen Zweck? – Alex
SuppressFinalize funktioniert für einzelne Objekte. Definitiv nicht im ganzen GC. Von MSDN: Objekte, die die IDisposable-Schnittstelle implementieren, können diese Methode von der IDisposable.Dispose-Methode aufrufen, um zu verhindern, dass der Garbage Collector Object.Finalize für ein Objekt aufruft, das dies nicht benötigt. (Also im Grunde ist es eine sehr geringe Leistungsverbesserung.) –
Ich sehe nicht, wie dies einen Hinweis hinzufügen würde, um * Garbage Collection * per se zu verhindern; Wenn Sie 'GC.AddMemoryPressure' aufrufen, führt dies höchstwahrscheinlich dazu, dass die CLR * mehr * Garbage Collections erstellt, da dies anzeigt, dass der für die CLR verfügbare Speicher für den Prozess (virtuell oder nicht) geringer ist, als er denkt. Man könnte * GC.RemoveMemoryPressure' ohne einen entsprechenden Aufruf von 'GC.AddMemoryPressure' aufrufen, um zu versuchen, die CLR zu denken, dass sie mehr Speicher als sie hat, aber man würde denken, dass die API resistent ist (man würde hoffe) auf solche Dinge. – casperOne
Nein, gibt es nicht. Im besten Fall können Sie die Garbage-Collection selbst auslösen, obwohl dies als sehr schlecht angesehen wird, da es die eingebauten Scheduling-Algorithmen, die vom GC verwendet werden, beeinträchtigen kann.
Sie können nicht auslösen auslösen , kann nur "vorschlagen" zu. GC wird selbst entscheiden –
Im Allgemeinen, nein. Und die meisten Leute würden es als vorzeitige Optimierung betrachten, sich um die Speicherbereinigung zu sorgen, es sei denn, Sie machen ein Profiling und finden heraus, dass es wirklich die Ursache für die schlechte Leistung in Ihrer Anwendung ist.
Wenn Sie an der Feinabstimmung des GC für die Leistung interessiert sind (oder eher, optimieren Sie Ihre App, um die Leistung im Vergleich zum GC zu verbessern), MSDN hat eine ziemlich anständige Beschreibung der Möglichkeiten, es zu tun.
Inzwischen möglich es ist, gibt es Methoden in der GC
class:
GC.TryStartNoGCRegion(...)
und GC.EndNoGCRegion()
.
Garbage Collection ist nicht Teil der C# -Programmiersprache. Es ist Teil der .NET CLR. –
"Irgendwie." Wenn Sie niemals etwas zuweisen, wird der GC niemals sammeln. Ordnen Sie alles vor, was Sie brauchen, und rufen Sie 'GC.Collect()' auf. –
Vielleicht werfen Sie auch einen Blick auf diese Antwort: http://stackoverflow.com/questions/6005865/prevent-net-garbage-collection-for-short-period-of-time/6005949#6005949 – Gamlor