-
Path: news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!p
ostnews.google.com!w6g2000yqw.googlegroups.com!not-for-mail
From: Maciej Sobczak <s...@g...com>
Newsgroups: pl.comp.programming
Subject: Opowiadanie o GC
Date: Mon, 27 Jul 2009 01:38:18 -0700 (PDT)
Organization: http://groups.google.com
Lines: 93
Message-ID: <2...@w...googlegroups.com>
NNTP-Posting-Host: 137.138.182.236
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: quoted-printable
X-Trace: posting.google.com 1248683901 20149 127.0.0.1 (27 Jul 2009 08:38:21 GMT)
X-Complaints-To: g...@g...com
NNTP-Posting-Date: Mon, 27 Jul 2009 08:38:21 +0000 (UTC)
Complaints-To: g...@g...com
Injection-Info: w6g2000yqw.googlegroups.com; posting-host=137.138.182.236;
posting-account=bMuEOQoAAACUUr_ghL3RBIi5neBZ5w_S
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.12)
Gecko/2009070609 Firefox/3.0.12,gzip(gfe),gzip(gfe)
Xref: news-archive.icm.edu.pl pl.comp.programming:182801
[ ukryj nagłówki ]Jest taki problem.
Program działający w systemie rozproszonym tworzy lokalnie i
przetwarza obiekty typu Item. Każdy Item ma swój unikalny
identyfikator typu long. Item zna swoje id, któro jest znane również
innym programom działającym w systemie. Te inne programy wpływają na
stan lokalnych obiektów Item na podstawie ich id.
Jeżeli program porzuci swój lokalny obiekt Item, to wszystko co
dotyczy jego id może być później zignorowane. Zwykle porzucanie
obiektów Item następuje wtedy, gdy i tak nie ma szansy na dalsze
interakcje dotyczące tego id, ale nie musi tak być.
Ponieważ przy każdym komunikacie przychodzącym z zewnątrz trzeba jakoś
znaleźć odpowiedni lokalny obiekt Item, w programie istnieje mapa,
której kluczem jest long a wartością jest Item (bądź wskaźnik na
Item), czyli która dla danego id potrafi znaleźć Item.
Z powodów, które nie są ważne w tej dyskusji, ten projekt jest pisany
zarówno w C++ jak i w Javie.
W C++ typ Item ma destruktor, który wyrejestrowuje swoje id z mapy.
Dzięki temu, jeśli program "porzuci" jakiś obiekt Item (przez co nie
może już go obserwować i reagować na zmiany jego stanu), to
odpowiadający mu wpis w mapie jest natychmiast wyrzucany. W
szczególności, jeśli program używa obiektów Item w takiej pętli:
for (...)
{
Item it;
// ...
}
to w efekcie mapa nigdy nie ma więcej, niż 1 wpis. Zużycie pamięci
jest wtedy *stałe* (albo ma znaną górną granicę) - dotyczy to również
bardziej złożonych, ale nadal cyklicznych układów.
W Javie nie ma destruktorów, ale jest GC. Jeśli program "porzuci"
jakiś obiekt Item, to w pamięci wisi zarówno obiekt Item, jak i
odpowiadający jego id wpis w mapie. Wyciek.
Na szczęście są słabe referencje, ale uwaga - Item jest *wartością* a
nie kluczem w mapie. W najlepszym razie GC posprząta obiekty Item, ale
wpisy w mapie pozostaną, przez co mapa i tak puchnie w nieskończoność.
Wyciek.
Można pomyśleć o podpięciu się pod finalizator, ale w opinii
szanowanych obywateli jest to robienie wiochy. Zamiast tego doradzono
mi zrobić *dodatkowy wątek*, który będzie okresowo jeździł po mapie i
wywalał wpisy, których wartości się wyzerowały (czyli te wpisy,
których obiekty Item zostały posprzątane przez GC).
To rozwiązanie *prawie* działa, ale ma takie dwie przykre cechy:
* Komplikuje projekt wymuszając istnienie dodatkowego wątku.
* Wprowadza dodatkowe wartości konfiguracyjne służące do strojenia
pracy tego wątku (okres skanowania).
Piszę *prawie*, bo pomiędzy posprzątaniem obiektów Item (hint: to się
dzieje dopiero wtedy, gdy GC jest wystarczająco zestresowany, żeby się
w ogóle ruszyć - co następuje akurat wtedy, gdy *zaczyna brakować
pamięci*) a skanem mapy jest pewien odstęp czasu, kiedy niepotrzebne
już wpisy w mapie *nadal* zajmują pamięć, zmniejszając efektywnie pulę
dostępnej pamięci. To powoduje, że przy dalszej pracy programu GC
szybciej będzie zestresowany i znowu coś tam posprząta, ale przez nowe
wiszące wpisy w mapie i tak zostawi jeszcze mniejszą pulę wolnej
pamięci. Ostatecznie program wylatuje na jej braku, chociaż z
projektowego punktu widzenia może nigdy nie używać więcej, niż jednego
obiektu Item.
Oczywiście zmiany okresu skanowania mapy wpływają jedynie na
*prawdopodobieństwo* poprawnego działania całego programu i nigdy nie
można tej poprawności *zagwarantować*.
Ot, taka sobie historyjka. Ale może ktoś znudzony upałami i burzami
wpadnie na jakiś pomysł, jak to poprawić.
Jedną z możliwości jest dodatnie do klasy Item funkcji close() i
uprzejme poproszenie programisty, żeby jej używał. Jest to
rozwiązanie, którego poziom abstrakcji i wartość projektowa
odpowiadają językowi C.
Są inne?
--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
Następne wpisy z tego wątku
- 27.07.09 09:30 Jacek Czerwinski
- 27.07.09 09:40 Michal Kleczek
- 27.07.09 09:50 Krzysiek Kowaliczek
- 27.07.09 10:09 Michal Kleczek
- 27.07.09 10:11 Krzysiek Kowaliczek
- 27.07.09 10:16 Michal Kleczek
- 27.07.09 10:19 Michal Kleczek
- 27.07.09 10:21 Michal Kleczek
- 27.07.09 10:24 Sebastian Nibisz
- 27.07.09 10:27 Krzysiek Kowaliczek
- 27.07.09 10:31 Michal Kleczek
- 27.07.09 10:44 Krzysiek Kowaliczek
- 27.07.09 10:54 Michal Kleczek
- 27.07.09 11:19 Krzysiek Kowaliczek
- 27.07.09 11:22 Michal Kleczek
Najnowsze wątki z tej grupy
- Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- A Szwajcarzy kombinują tak: FinalSpark grows human neurons from stem cells and connects them to electrode arrays
- Re: Najgorszy język programowania
- NOWY: 2025-09-29 Alg., Strukt. Danych i Tech. Prog. - komentarz.pdf
- Na grupie comp.os.linux.advocacy CrudeSausage twierdzi, że Micro$lop używa SI do szyfrowania formatu dok. XML
- Błąd w Sofcie Powodem Wymiany 3 Duńskich Fregat Typu Iver Huitfeldt
- Grok zaczął nadużywać wulgaryzmów i wprost obrażać niektóre znane osoby
- Can you activate BMW 48V 10Ah Li-Ion battery, connecting to CAN-USB laptop interface ?
- We Wrocławiu ruszyła Odra 5, pierwszy w Polsce komputer kwantowy z nadprzewodzącymi kubitami
- Ada-Europe - AEiC 2025 early registration deadline imminent
- John Carmack twierdzi, że gdyby gry były optymalizowane, to wystarczyły by stare kompy
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2025
- Linuks od wer. 6.15 przestanie wspierać procesory 486 i będzie wymagać min. Pentium
- ,,Polski przemysł jest w stanie agonalnym" - podkreślił dobitnie, wskazując na brak zamówień.
- Rewolucja w debugowaniu!!! SI analizuje zrzuty pamięci systemu M$ Windows!!!
Najnowsze wątki
- 2025-12-31 I kolejny jebnięty
- 2025-12-31 Myślenice => Specjalista ds. kontrolingu <=
- 2025-12-31 Ostróda szlachetnie walczy
- 2025-12-31 Pierwsza mapa kosmosu w 102 długościach fal podczerwieni! To początek nowej ery w astronomii
- 2025-12-31 Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- 2025-12-31 Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- 2025-12-31 Pieniadze-cuchna-oddechem-nawalonego-tatusia
- 2025-12-31 Iran na skraju gospodarczego upadku. Na ulicach Teheranu (znów) wrze. To może być cios dla reżimu
- 2025-12-30 zasilacz
- 2025-12-30 Teraz System Plików PFS z sys. op. Amiga OS będziesz mógł zamontować pod sys. op. Linuks i Jabłoko Makintosz
- 2025-12-30 Aeor2 i ciągły internet 512kb
- 2025-12-30 Czy prohibicja (reklamowa) obejmuje Św. Mikołaja (przerośniętego krasnala)? :-)
- 2025-12-30 Zegary DCF
- 2025-12-29 Greta Thunberg aresztowana w Londynie za wsparcie zdelegalizowanej grupy [Palestine Action - przyp. JMJ]
- 2025-12-29 Sarkozy




5 Najlepszych Programów do Księgowości w Chmurze - Ranking i Porównanie [2025]