Funkcja FullGC normaly zatrzymuje wszystkie wątki podczas pracy. Posiadanie dwóch AppDomains, z których każda ma kilka wątków. Czy po uruchomieniu GC wszystkie wątki będą wstrzymane lub tylko te z jednej AppDomain?Czy usuwanie śmieci odbywa się na poziomie procesu lub na poziomie aplikacji?
Odpowiedz
Z tego wątku tutaj: Is the garbage collector in .net system-wide or application-wide?, występuje na poziomie procesu. Wszystkie wątki w tym procesie zostaną wstrzymane, ale nie w wielu procesach.
Jedna lub wiele domen aplikacji może istnieć w procesie, ale domeny aplikacji nie są współużytkowane między procesami. Per: http://blogs.msdn.com/b/tess/archive/2008/08/19/questions-on-application-domains-application-pools-and-unhandled-exceptions.aspx, "wszystkie aplikacje uczestniczące w procesie mają taki sam GC." W związku z tym GC powinna wpływać na wszystkie domeny aplikacji po uruchomieniu GC.
Jednak wydajność wydajności procesora może wystąpić, gdy zbyt wiele procesów spędza czas na GC, co może negatywnie wpłynąć na wydajność innych procesów niezaangażowanych w GC.
Ten link wyjaśnia również podstawy GC też:
Trudno odpowiedzieć, najlepszą rzeczą do zrobienia jest tylko przetestować go:
using System;
using System.Reflection;
public class Program : MarshalByRefObject {
static void Main(string[] args) {
var dummy1 = new object();
var dom = AppDomain.CreateDomain("test");
var obj = (Program)dom.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Program).FullName);
obj.Test();
Console.WriteLine("Primary appdomain, collection count = {0}, gen = {1}",
GC.CollectionCount(0), GC.GetGeneration(dummy1));
Console.ReadKey();
}
public void Test() {
var dummy2 = new object();
for (int test = 0; test < 3; ++test) {
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.WriteLine("In appdomain '{0}', collection count = {1}, gen = {2}",
AppDomain.CurrentDomain.FriendlyName, GC.CollectionCount(0),
GC.GetGeneration(dummy2));
}
}
wyjściowa:
In appdomain 'test', collection count = 3, gen = 2
Primary appdomain, collection count = 3, gen = 2
Dobry dowód, że GC wpływa na wszystkie AppDomains w domyślnym CL Host R. To mnie zaskoczyło.
- 1. import na poziomie modułu lub na poziomie funkcji?
- 2. Kiedy odbywa się usuwanie śmieci dla klasy z danymi statycznymi
- 3. Przekierowanie na poziomie krajowym
- 4. błąd na poziomie transportu doszło
- 5. Czy istnieje atrybut warunkowy na poziomie klasy?
- 6. android: theme = "@ android: style/Theme.NoTitleBar.Fullscreen" działa na poziomie aplikacji, ale nie na poziomie aktywności. Jakaś wskazówka?
- 7. Ustaw NullValueHandling na poziomie kontrolera
- 8. Sieć pakietowa na poziomie Android
- 9. Co decyduje o poziomie uprzywilejowania procesu?
- 10. Scalanie na pojedynczym poziomie MultiIndex
- 11. Doświadczenie na poziomie algorytmu PHP
- 12. Dlaczego mają modyfikatory dostępu na poziomie klasy zamiast na poziomie obiektu?
- 13. Ograniczanie zestawów szyfrów na poziomie JRE
- 14. . Usuwanie śmieci .NET - na co wpływa?
- 15. Wydajność Androida na poziomie 11 i wyższym
- 16. zdefiniować właściwość dynamicUpdate na poziomie aplikacji dla wszystkich podmiotów?
- 17. Tworzenie gier na Androida i usuwanie śmieci
- 18. Android: Używanie PopupMenu na poziomie API 9
- 19. Skonfiguruj log4net, aby wysyłać błędy do różnych aplikacji na poziomie
- 20. importować klasę z folderu na innym poziomie
- 21. Bezpieczeństwo na poziomie obszaru dla asp.net mvc
- 22. lmer: prognozy na poziomie populacji powodują błąd
- 23. Ustawianie NTAuthenticationProviders na poziomie aplikacji w IIS 6
- 24. Ruby Minitest: Konfiguracja na poziomie klasy lub klasy?
- 25. Różnica między identyfikatorem własnym na poziomie klasy i na poziomie członkowskim w F #?
- 26. Jaka jest różnica między transakcją SQL na poziomie procedury składowanej a taką na poziomie SqlConnection?
- 27. Czy mogę zastąpić wiązania określone na poziomie klasy w instancji?
- 28. "Importuj" i "eksportuj" mogą pojawiać się tylko na najwyższym poziomie.
- 29. Przechwytywanie na poziomie metod z paramami
- 30. Ustaw NOCOUNT OFF na poziomie bazy danych?
Czy na pewno każda AppDomena ma własną stertę? Jest to sprzeczne z odpowiedzią Briana Rasmussena: http://stackoverflow.com/questions/574708/what-is-appdomain i odpowiedź Aghilasa Yakouba: http://stackoverflow.com/questions/12219815/appdomains-and-gc- sterty –
"AppDomains są częścią tego samego procesu i dlatego faktycznie udostępniają tę samą zarządzaną stertę". Czy to nie jest sprzeczne z tym, co powiedziałeś? Zobacz także mój komentarz do mojego komentarza, Aghilas mówi: "Masz stertę dla procesu, a domeny aplikacji dzielą tę stertę." O ile się nie mylę, wydaje się, że przynajmniej jedna odpowiedź (twoja lub ich) wymaga korekty. –
Dobra, uspokoję to. Są logicznie różne, ponieważ uchwyt obiektu wskazuje na specyficzną strukturę danych AppDomain. A zatem musi być zebrany w różnych domenach. Ale na pewno są dowody z testu, że sterty GC są podzielone. –