C# – Killing the system!

C# – Killing the system!

C# i środowisko uruchomieniowe języka (common language runtime) są ściśle ze sobą powiązane. I Jednym z przykładów tej relacji jest sposób działania czyszczenia pamięci. Wiemy, że w C# możemy zbudować nowy obiekt, kiedy tylko będziemy go potrzebować. Używając operatora new, możemy stworzyć obiekt.

I nigdy nie musimy martwić się o zarządzanie czasem życia tego obiektu. Środowisko wykonawcze ma wystarczającą ilość informacji, aby określić, kiedy już nie używamy obiektu, i może zwolnić miejsce tego obiektu.

I moduł odśmiecania pamięci (garbage collector) robi to okresowo sprawdza on wszystkie statyczne zmienne globalne, które są dostępne w naszym programie, a także wszystkie zmienne lokalne działające w naszym programie.   

Person person = new Person();

public class Person
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public string Email { get; set; }
}

Robiąc to, znajdzie na przykład zmienną o nazwie osoba, która odwołuje się do obiektu Osoba na stercie. I Wie też, że ten obiekt osoba ma właściwość string, która odwołuje się do innego obiektu na stercie. Więc wie, że te bloki są używane, ale może oznaczyć te bloki jako wolne i otwarte, ponieważ nie znalazł już żadnych odniesień do tych obszarów. Mogą to być zmienne, które wyszły poza zakres.

I Kompilator C# posiada wystarczające informacje o strukturach danych, których używamy, a moduł odśmiecania pamięci zna dokładny rozmiar wszystkich tych obiektów i wie, jakie inne odwołania mogą zawierać. I Teraz, gdy moduł czyszczenia pamięci znajdzie te nieużywane miejsca, może je zwolnić, ale tutaj wykonuje jeszcze jeden dodatkowy krok.

Robi również to, co nazywamy zagęszczaniem sterty. Więc te bloki, które mogą znajdować się między przydzielonymi obiektami można skondensować, abyśmy mieli dostępne większe bloki wolnej przestrzeni.

Dzięki temu sterta jest w dobrej kondycji i jest to bardzo podobna do defragmentacji dysku twardego. I Kompaktowanie sterty jest w dużej mierze optymalizacją, która może pomóc naszym programom działać szybciej!!!

Ponieważ moduł czyszczenia pamięci przesuwa obiekty, musi również naprawić odniesienia. Zatem właściwość nazwa osoby, która poprzednio odwoływała się do ciągu znaków znajdującego się gdzies na stertcie, to to odwołanie musi zostać naprawione przez moduł czyszczenia pamięci, tak aby odwoływało się do właściwego obiektu.

Ale My nie musimy się tym martwić. To wszystko dzieje się za kulisami i jest to jedna z zalet uruchamiania kodu zarządzanego. MY Możemy po prostu skupić się na rozwiązywaniu jakiegoś problemu biznesowego i pozwolić modułowi czyszczenia pamięci zająć się wszystkimi problemami związanymi z pamięcią. W pewnym momencie możemy już nie potrzebować tego obiektu osoba, bo wyjdzie poza zakres.
Nie będzie już odniesienia do tego obiektu na stercie.

A moduł czyszczenia pamięcigarbage collector może przyjść i zwolnić wszystko, co było związane z tą zmienną. I teraz Chcę zademonstrować niektóre funkcje modułu czyszczenia pamięci (garbage collectora) za pomocą prostej aplikacji konsolowej.

class Program
{
 static void Main(string[] args)
 {
   for (int i = 0; i < 1000000; i++)
   {
    new Person() { Id = i, Name = i.ToString(), Email = i.ToString() };

    if (i % 100000 == 0)
    {
      Console.WriteLine(GetTotalCollections());
    }
   }
 }

 static int GetTotalCollections()
 {
   return GC.CollectionCount(0) +
          GC.CollectionCount(1) +
          GC.CollectionCount(2);
 }

 static List<Person> people = new List<Person>();
}

I co tutaj robimy: 

W pętli tworzymy 1 000 000 obiektów osoba. I nie zamierzamy zapisywać odniesienia do tych obiektów. Po prostu tworzymy ich instancję. I natychmiast staną one się śmieciami na stercie, ponieważ nikt nie ma odniesienia do tych obiektów. Są to bardzo małe obiekty klasy Person co widać powyżej (Id, Name, Email).

I następnie tutaj Co 100 000 przejscie petli będziemy wypisywać całkowitą liczbę operacji czyszczenia pamięci, które miały miejsce.

Uruchommy teraz ten program!

Jak widać, w tej chwili mniej więcej po 200 000 obiektów utworzonych, zanim moduł odśmiecania pamięcigarbage collector włączy się i trochę wyczyścił stertę. Ale spróbujmy czegoś innego.

Wróćmy do naszego programu i powiększmy nasz obiekt osoba. Dodamy tablicę bajtów, która rezerwuje wystarczająco dużo miejsca do przechowywania 100 000 bajtów.         

byte[] table = new byte[100000];

Każdy osoba, którą teraz stworzymy, będzie wymagał znacznie więcej miejsca na stercie.

A teraz ponownie uruchom nasz program!

Jak widać, nadal wykonujemy prace dość szybko, ale tym razem mieliśmy ponad 84375 kolekcji (czyli operacji czyszczenia pamięci) które miały miejsce. Więc garbage collector nie hamował znacząco naszej wydajności, a mimo to ogromnie nam pomagał.

W tej chwili nie przechowujemy odniesienia do żadnego z tych obiektów, ale tak się składa, że mamy tutaj listę i zamiast po prostu tworzyć śmieci, zapiszmy odniesienie do każdego obiektu osoba podczas jego tworzenia na liscie.

people.Add(new Person() { Id = i, Name = i.ToString(), Email = i.ToString() });

A teraz ponownie uruchommy nasz program.

I widzimy, że przeszliśmy przez około 600 000 iteracji, zanim wystąpił wyjątek braku pamięci. Zapełniliśmy całą stertę tak wieloma tablicami bajtowymi i obiektami osoba,
że po prostu zabrakło miejsca, a środowisko wykonawcze nie mogło już przydzielić pamięci.

Wróćmy do programu i przyjrzyjmy się, jak obliczaliśmy całkowitą liczbę kolekcji (czyli operacji czyszczenia pamięci). Używamy klasy o nazwie GC, która jest skrótem od garbage collector, i która udostępnia szereg statycznych metod i statycznych właściwości, których można użyć do interakcji z garbage collector.

Ale musimy być ostrożni, ponieważ niektóre interfejsy API, takie jak metoda Collect, która mówi modułowi czyszczenia pamięci, aby dokonał kolekcji (czyli operacji czyszczenia pamięci) może czasami być szkodliwa dla naszego programu.

Czasami najlepiej jest pozwolić, aby środowisko wykonawcze i moduł czyszczenia pamięci pracowały razem, aby dowiedzieć się, kiedy najlepiej jest uruchomić kolekcję (czyli operacji czyszczenia pamięci) zamiast na siłę i robić to ręcznie.

Metody, których tutaj używamy to CollectionCount(), pytamy moduł czyszczenia pamięci, ile kolekcji zostało uruchomionych w określonej generacji?

Tak w normalnie zarządzanej stercie istnieją trzy generacje obiektów. Kiedy po raz pierwszy tworzymy obiekt, jest on umieszczany w Generacji 0.

A jeśli przeżyją oczyszczanie śmieci, to znaczy nadal będą do niego odwołania po uruchomieniu modułu czyszczenia pamięci, zostanie awansowany do Generacji 1, a jeśli przetrwa tam to zostanie awansowany do generacji 2.  

Jest to optymalizacja wykorzystania modułu czyszczenia pamięci ponieważ większość aplikacji ma ogromną liczbę krótkotrwałych obiektów. Tworzymy obiekty, które są używane tylko w jednej metodzie, których później już nie potrzebujemy.

Te typy obiektów będą żyć w generacji 0, która zwykle jest zbierana częściej niż generacja 1 i 2, ponieważ generacja 1 i 2 zawiera obiekty, które już przeżyły kolekcję (czyli operacji czyszczenia pamięci) i mogą zostać przez jakiś czas.

https://github.com/mariuszjurczenko/Csharp

Pobawmy się teraz jeszcze trochę: Cały materiał na tym filmie.

57 comments

  1. Good way of telling, and good piece of writing to take facts on the topic of my presentation subject matter, which i am going to convey in university. Dacia Clemente Marva

  2. I cannot thank you enough for the post. Really looking forward to read more. Ansley Cullie Lash

  3. I’m truly enjoying the design and layout of your website.
    It’s a very easy on the eyes which makes it much more enjoyable for me to come here and visit more often. Did you hire out a designer to create your theme?

    Exceptional work!

  4. Magnificent goods from you, man. I’ve bear in mind your
    stuff previous to and you are simply extremely fantastic.
    I really like what you’ve acquired here, really like what you’re saying and the best way wherein you are saying
    it. You are making it enjoyable and you still care for to keep it sensible.
    I can’t wait to read much more from you. That is actually a tremendous website.

  5. I really like it when folks come together and share thoughts. Pansy Kennett Glaser

  6. I do not even know how I finished up here, but I thought this post was
    great. I don’t recognize who you are but definitely you’re going to a famous
    blogger in the event you are not already. Cheers!

  7. Hi, just wanted to say, I liked this article. It was funny. Karee Saul Far

  8. Good response in return of this matter with firm arguments and describing everything on the topic of that. Maure Mead Carleton

  9. You made some really good points there. I checked on the net to find out more about the issue and found most people will go along with your views on this website. Tansy Dev Roy

  10. I was very pleased to discover this great site. I need to to thank you for ones time for this wonderful read!! I definitely appreciated every little bit of it and i also have you saved to fav to look at new things in your site. Eunice Ken Mosra

  11. Greetings! Very helpful advice within this post! It is the little changes that will make the most important changes. Thanks a lot for sharing! Miriam Garvin Marleah

  12. Have you ever thought about including a little bit more than just your articles? Rora Auberon Misty

  13. Having read this I thought it was extremely enlightening. I appreciate you taking the time and energy to put this informative article together. I once again find myself spending a lot of time both reading and posting comments. But so what, it was still worth it. Ketti Jeramie Shriver

  14. Hello there. I found your blog by way of Google at the same time as searching for a related topic, your site came up. It appears to be great. I have bookmarked it in my google bookmarks to visit then. Paola Duky Oringa

  15. Hey there, I think your website might be having browser compatibility issues. When I look at your blog in Chrome, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, excellent blog! Clarabelle Morgen Edric

  16. Good post. I will be facing some of these issues as well.. Pansy Tedman Hephzipah

  17. You made some fine points there. I did a search on the subject and found most folks will go along with with your blog. Martina Rutledge Herrle

  18. Aw, this was an exceptionally nice post. Finding the time and actual effort to make a top notch article? Dorolice Sherm Dorkus

  19. I am actually grateful to the owner of this web site who has shared this enormous article at at this place. Arabela Rodrick Pablo

  20. Pretty! This has been an incredibly wonderful article. Thank you for supplying this info. Vilhelmina Lockwood Durwyn

  21. Thank you for each of your hard work on this web page. My mom takes pleasure in participating in research and it is easy to see why. I know all about the lively way you convey valuable items on the web blog and as well as cause contribution from some other people on that issue then our favorite child is really understanding a great deal. Enjoy the remaining portion of the year. Your conducting a tremendous job. Lyndsie Kerk Vladi

  22. I really wanted to write down a small note to express gratitude to you for these unique solutions you are placing on this website. My incredibly long internet look up has at the end been honored with brilliant information to write about with my companions. I would tell you that most of us visitors actually are undeniably blessed to be in a perfect place with many outstanding individuals with interesting pointers. I feel truly lucky to have encountered your entire weblog and look forward to some more thrilling minutes reading here. Thanks a lot again for all the details. Antonina Sax Alli

  23. Jeśli ktoś życzy sobie opinii eksperta na temat blogowania, sugeruję, aby odwiedziła ten blog internetowy.

  24. I’m gone to convey my little brother, that he should also visit this web site on regular
    basis to obtain updated from newest news.

  25. Please bring the continuation of the nice posts, I will be glad if you approve the comment.

  26. Please bring the continuation of the nice posts, I will be glad if you approve the comment.

  27. I am a strict follower of you, too, can you please approve this post.

  28. Od czasu do czasu śledzę twoją fajną witrynę dobra robota

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *