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ęci – garbage 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ęci – garbage 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.
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
thanks
I cannot thank you enough for the post. Really looking forward to read more. Ansley Cullie Lash
thanks
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!
thanks
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.
thanks
I really like it when folks come together and share thoughts. Pansy Kennett Glaser
thanks
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!
thanks
Hi, just wanted to say, I liked this article. It was funny. Karee Saul Far
thanks
Good response in return of this matter with firm arguments and describing everything on the topic of that. Maure Mead Carleton
thanks
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
thanks
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
thanks
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
thanks
Have you ever thought about including a little bit more than just your articles? Rora Auberon Misty
thanks
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
thanks
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
thanks
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
thanks
Good post. I will be facing some of these issues as well.. Pansy Tedman Hephzipah
thanks
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
thanks
Aw, this was an exceptionally nice post. Finding the time and actual effort to make a top notch article? Dorolice Sherm Dorkus
thanks
I am actually grateful to the owner of this web site who has shared this enormous article at at this place. Arabela Rodrick Pablo
thanks
Pretty! This has been an incredibly wonderful article. Thank you for supplying this info. Vilhelmina Lockwood Durwyn
thanks
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
thanks
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
thanks
Jeśli ktoś życzy sobie opinii eksperta na temat blogowania, sugeruję, aby odwiedziła ten blog internetowy.
dzieki
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.
Please bring the continuation of the nice posts, I will be glad if you approve the comment.
Please bring the continuation of the nice posts, I will be glad if you approve the comment.
thank you admin
bardzo dobrze się czyta , bardzo praktyczny materiał
Thank you for this nice article!!!!!!
Hello, thank you for this article
I am a strict follower of you, too, can you please approve this post.
Od czasu do czasu śledzę twoją fajną witrynę dobra robota
Twój artykuł jest jak mapa dla osób, które chcą zgłębić się w [temat]. Bardzo pomocne
Wspaniały artykuł! Jesteś prawdziwym ekspertem w temacie
Nice blog, nice articles! Add favorite thanks.
Nice blog, very nice articles! Add favorite thanks.
Trzeba mieć wytrwałość i wiarę we własne siły Twój portal jest tego przykładem. Trzeba wierzyć, że człowiek jest do czegos zdolny i osiągnać to za wszelka cenę!.
Hello! good job keep it up
Niice post. I learn something totally new annd challenging on websites I stumbleupon everyday.
It’s always exciting to read through content from other writers and
practice something from their websites.
Thank you very much
Hi, i think that i saw you visited my weblog thus i came to ?return the favor?.I’m trying to find things to enhance my site!I suppose its ok to use a few of your ideas!!
Twój sposób prezentacji tematu sprawił, że nawet trudne koncepcje stały się łatwe do zrozumienia
Zawsze się czegoś nowego dowiaduję, czytając Twoje artykuły. Niezależnie od tego, czy jestem na początkowym etapie, czy już mam doświadczenie, zawsze znajduję coś wartościowego. Dzięki za to
Ciekawe spojrzenie na temat. Myślę, że warto podjąć dyskusję na ten temat w społeczności
Dzięki za dzielenie się swoją wiedzą. To naprawdę cenione
Cieszę się, że natknąłem się na ten artykuł. Precyzyjne i zwięzłe wyjaśnienia.