-
21. Data: 2009-07-27 11:40:52
Temat: Re: Opowiadanie o GC
Od: Krzysiek Kowaliczek <k...@g...com>
Michal Kleczek wrote:
> Krzysiek Kowaliczek wrote:
>> Wcale nie musisz używać "sprytnych wskaźników", np.:
>> zapamiętujesz obiekty Item w liście, wyświetlasz okna
>> lub inaczej "cudujesz" z obiektami Item. Po przetwarzaniu
>> usuwasz obiekty z listy.
>>
>
> A skad wiesz _kiedy_ mozna juz usunac Item z listy?
>
Ponieważ tak zaprojektowałem sobie system, że znam
czasy życia na poszczególnych etapach przetwarzania.
Serio, często tak robie zamiast spontanicznego i
radosnego używania sprytnych wskaźników gdzie popadnie.
Pozdrawiam
KK
-
22. Data: 2009-07-27 11:40:53
Temat: Re: Opowiadanie o GC
Od: Michal Kleczek <k...@g...com>
Maciej Sobczak wrote:
> On 27 Lip, 12:09, Michal Kleczek <k...@g...com> wrote:
>
>> > Nie trzeba watku skanujacego - wystarczy usuwajacy. Od skanowania jest
>> > java.lang.ref.ReferenceQueue
>>
>> Sprobuj moze jakos tak:
>
> [...]
>
> Tak, to wygląda ciekawie. W moim przypadku mogłoby to być nawet trochę
> prostsze, ale rdzeń rozwiązania pasuje do problemu. Dziękuję za
> pomysł.
Tak sobie jeszcze to przejrzalem i jest tam pare problemow zwiazanych z
faktem, ze jezeli obiekt Reference nie jest osiagalny to nie zostanie
umieszczony w ReferenceQueue. To powoduje taka sytuacje, ze w wypadku gdy
mapa jest pusta i przestanie byc osiagalna - watek czyszczacy nigdy sie nie
obudzi z referenceQueue.remove().
--
Michal
-
23. Data: 2009-07-27 11:41:08
Temat: Re: Opowiadanie o GC
Od: Maciej Sobczak <s...@g...com>
On 27 Lip, 13:22, Michal Kleczek <k...@g...com> wrote:
> Na poczatku wlasnie pytalem o kawalek kodu w cpp, ktory robi to _bez_ uzycia
> smart pointerow - ktore defacto sa namiastka GC.
To, czy użytkownik użyje smart pointery nie ma tu znaczenia, bo to
użycie byłoby na innym poziomie kodu. Najbardziej typowy scenariusz to
Item istniejący lokalnie - jego destruktor sprząta odpowiedni wpis w
mapie. Inne scenariusze są nadal możliwe, ale mechanizm czyszczenia
mapy jest ten sam, czyli nadal oparty na destruktorze klasy Item.
Problemem jest właśnie powiązanie obiektów Item z mapą.
--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
-
24. Data: 2009-07-27 11:44:19
Temat: Re: Opowiadanie o GC
Od: Maciej Sobczak <s...@g...com>
On 27 Lip, 11:50, Krzysiek Kowaliczek
<k...@g...com> wrote:
> > 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ć*.
>
> Dlaczego? Watek sprzątający może sam "kopnąć" GC.
Ale problem polega na tym, że wątek sprzątający zwykle śpi w czasie,
gdy *być może* brakuje pamięci. Cykl pracy wątku sprzątającego
kompletnie nie zależy od tego, kiedy brakuje pamięci.
> > 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.
>
> To nie jest złe. Dla bezpieczeństwa w finalizatorze można
> dodać asercje o niezwolnionym obiekcie.
Mam robić wiochę jako uzupełnienie kiepskiego rozwiązania? :-D
> > Są inne?
>
> Może zobaczyć jak zaimplementowali WeakHashMap ( tam "weak"
> jest klucz a nie wartość ).
Jest to jakaś opcja, ale chyba Sebastian podrzucił coś znacznie
prostszego.
--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
-
25. Data: 2009-07-27 11:45:08
Temat: Re: Opowiadanie o GC
Od: Michal Kleczek <k...@g...com>
Krzysiek Kowaliczek wrote:
> Michal Kleczek wrote:
>> Krzysiek Kowaliczek wrote:
>>> Wcale nie musisz używać "sprytnych wskaźników", np.:
>>> zapamiętujesz obiekty Item w liście, wyświetlasz okna
>>> lub inaczej "cudujesz" z obiektami Item. Po przetwarzaniu
>>> usuwasz obiekty z listy.
>>>
>>
>> A skad wiesz _kiedy_ mozna juz usunac Item z listy?
>>
>
> Ponieważ tak zaprojektowałem sobie system, że znam
> czasy życia na poszczególnych etapach przetwarzania.
> Serio, często tak robie zamiast spontanicznego i
> radosnego używania sprytnych wskaźników gdzie popadnie.
>
OK
Ale to jest trudne w wypadku przetwarzania wielowatkowego - mamy dwa watki
obslugi zdarzen dwoch okienek pokazujacych ten sam Item oraz watek
przetwarzajacy komunikaty dajmy na to z gniazda i uaktualniajacy
odpowiednie Itemy.
--
Michal
-
26. Data: 2009-07-27 11:51:47
Temat: Re: Opowiadanie o GC
Od: Maciej Sobczak <s...@g...com>
On 27 Lip, 12:24, "Sebastian Nibisz" <e...@p...onet.pl> wrote:
> Ja zaproponuje takie rozwiązanie.
>
> 1. Oprócz mapy kluczy, utworzyć kolejkę par [ID, Item].
> 2. W konstruktorze obiektu Item
> a) pobrać N > 1 par z kolejki,
> b) usunąć z mapy wpisy z martwymi referencjami,
> c) pary z żywymi referencjami dodać na koniec kolejki,
> d) utworzyć parę [ID, Item] dla bieżącego obiektu i dodać ja do mapy,
> oraz na koniec kolejki.
Tak naprawdę to całe rozwiązanie jest w 2b (brute-force to po prostu
pełny skan mapy w każdym konstruktorze Item). Nie potrzeba już żadnych
kolejek.
Nadal jest potencjalny problem z pamięcią, bo całość zależy od tego,
czy program będzie w przyszłości wołał konstruktory Item - czyli
zwalnianie pamięci jest stymulowane przez tworzenie obiektów jednego
tylko typu. Być może program nie stworzy już żadnego takiego obiektu.
Niemniej, to rozwiązanie jest dobre w połączeniu z obecnym cyklicznym
wątkiem.
--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
-
27. Data: 2009-07-27 11:58:09
Temat: Re: Opowiadanie o GC
Od: Maciej Sobczak <s...@g...com>
On 27 Lip, 13:40, Michal Kleczek <k...@g...com> wrote:
> Tak sobie jeszcze to przejrzalem i jest tam pare problemow zwiazanych z
> faktem, ze jezeli obiekt Reference nie jest osiagalny to nie zostanie
> umieszczony w ReferenceQueue. To powoduje taka sytuacje, ze w wypadku gdy
> mapa jest pusta i przestanie byc osiagalna - watek czyszczacy nigdy sie nie
> obudzi z referenceQueue.remove().
To nie jest problemem w moim przypadku, bo ta mapa istnieje zawsze - a
tak naprawdę jej istnienie jest powiązane z paroma zewnętrznymi
zasobami (to jest system rozproszony), więc musi być spełnione jedno z
dwóch:
* wszystkie ważne obiekty i wątki istnieją w nieskończoność
* gdzieś jest jakaś "rodzicielska" funkcja close(), która wszystko
zwija, łącznie z mapą i wątkami
Tzn. ta mapa nigdy nie przestaje być osiągalna ot tak jak jakiś za
przeproszeniem Item. :-)
To co można uprościć to wywalenie mapowania w drugą stronę - jak już
pisałem, Item zna swój id, więc druga osobna mapa nie jest potrzebna.
--
Maciej Sobczak * www.msobczak.com * www.inspirel.com
-
28. Data: 2009-07-27 11:58:27
Temat: Re: Opowiadanie o GC
Od: Michal Kleczek <k...@g...com>
Maciej Sobczak wrote:
> On 27 Lip, 13:22, Michal Kleczek <k...@g...com> wrote:
>
>> Na poczatku wlasnie pytalem o kawalek kodu w cpp, ktory robi to _bez_
>> uzycia smart pointerow - ktore defacto sa namiastka GC.
>
> To, czy użytkownik użyje smart pointery nie ma tu znaczenia, bo to
> użycie byłoby na innym poziomie kodu. Najbardziej typowy scenariusz to
> Item istniejący lokalnie - jego destruktor sprząta odpowiedni wpis w
> mapie. Inne scenariusze są nadal możliwe, ale mechanizm czyszczenia
> mapy jest ten sam, czyli nadal oparty na destruktorze klasy Item.
>
A jaka to roznica (oprocz tego _kiedy_ wpis zostanie usuniety z mapy) czy to
bedzie destruktor czy finalizer? Przy GC i tak nie ma determinizmu...
--
Michal
-
29. Data: 2009-07-27 11:59:26
Temat: Re: Opowiadanie o GC
Od: Krzysiek Kowaliczek <k...@g...com>
Maciej Sobczak wrote:
> On 27 Lip, 11:50, Krzysiek Kowaliczek
> <k...@g...com> wrote:
>
>>> 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ć*.
>> Dlaczego? Watek sprzątający może sam "kopnąć" GC.
>
> Ale problem polega na tym, że wątek sprzątający zwykle śpi w czasie,
> gdy *być może* brakuje pamięci. Cykl pracy wątku sprzątającego
> kompletnie nie zależy od tego, kiedy brakuje pamięci.
>
Można go obudzić w czasie tworzenia Item. Ewentualnie
zrezygnować z dodatkowego wątku i przeprowadzać czyszczenie
w czasie tworzenia Item.
>>> 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.
>> To nie jest złe. Dla bezpieczeństwa w finalizatorze można
>> dodać asercje o niezwolnionym obiekcie.
>
> Mam robić wiochę jako uzupełnienie kiepskiego rozwiązania? :-D
>
Oczywiście. Najlepiej "cichaczem" ukryć przed programistą
problem niezwolnionych zasobów. Później dopiero jest wiocha
na sto dwa jak zaczyna brakować deskryptorów plików u
klienta. Jak dla mnie sytuacja jest prosta nie zwolniłeś
zasobu to asercją po łapach.
Pozdrawiam
KK
-
30. Data: 2009-07-27 12:26:46
Temat: Re: Opowiadanie o GC
Od: A.L. <a...@a...com>
On Mon, 27 Jul 2009 01:38:18 -0700 (PDT), Maciej Sobczak
<s...@g...com> wrote:
>Jest
>
>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?
WeakHashMap?...
A hashtable-based Map implementation with weak keys. An entry in a
WeakHashMap will automatically be removed when its key is no longer in
ordinary use. More precisely, the presence of a mapping for a given
key will not prevent the key from being discarded by the garbage
collector, that is, made finalizable, finalized, and then reclaimed.
When a key has been discarded its entry is effectively removed from
the map, so this class behaves somewhat differently than other Map
implementations.
A.L.