eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Opowiadanie o GC
Ilość wypowiedzi w tym wątku: 79

  • 41. Data: 2009-07-28 12:48:52
    Temat: Re: Opowiadanie o GC
    Od: Paweł Kierski <n...@p...net>

    A.L. wrote:
    [...]
    >> Ech - ostatecznie chyba zrobię funkcję close(). Programiści Javy są do
    >> takich funkcji mocno przyzwyczajeni, więc chyba nie będą marudzić przy
    >> jeszcze jednej? :-|
    >
    > W jezkach z GC, wbrew powszechnej opinii, tez potzrebne sa
    > destruktory. Czasami. Wiec nei widz nic zlego w close(), tyle ze ja
    > taka metode nazywam destroy()

    Jakby jeszcze takie destruktory miały wsparcie w języku w kierunku
    deterministycznego/jak najszybszego wywoływania, to byłoby super.
    Wystarczyłoby chyba wywołanie takiego destruktora w momencie porzucania
    obiektu, a nie (jak finalizatora) w momencie usuwania przez GC. To
    wprawdzie spowodowałoby wolniejszą obsługę referencji do tego typu
    obiektów, ale za to byłaby możliwość dania dobrych wskazówek dla GC +
    szybkie zwalnianie zewnętrznych zasobów.

    --
    Paweł Kierski
    n...@p...net


  • 42. Data: 2009-07-28 19:18:13
    Temat: Re: Opowiadanie o GC
    Od: "Marcin 'Qrczak' Kowalczyk" <q...@k...org.pl>

    On Jul 28, 2:48 pm, Paweł Kierski <n...@p...net> wrote:

    >    Jakby jeszcze takie destruktory miały wsparcie w języku w kierunku
    > deterministycznego/jak najszybszego wywoływania, to byłoby super.
    > Wystarczyłoby chyba wywołanie takiego destruktora w momencie porzucania
    > obiektu, a nie (jak finalizatora) w momencie usuwania przez GC.

    Nie da się tego pogodzić z efektywnym GC. Nie wiadomo, kiedy dokładnie
    obiekt jest "porzucany", bo do obiektu mogą się odwoływać różne inne
    obiekty, więc potencjalnie trzeba by to wiedzieć o wszystkich - czyli
    trzeba by uaktualniać wiedzę o dostępnych obiektach na bieżąco, przy
    każdej operacji, zamiast amortyzowania tego po wielu operacjach.


  • 43. Data: 2009-07-28 19:53:22
    Temat: Re: Opowiadanie o GC
    Od: A.L. <a...@a...com>

    On Tue, 28 Jul 2009 07:34:11 -0500, A.L. <a...@a...com> wrote:

    >On Mon, 27 Jul 2009 13:36:43 -0700 (PDT), Maciej Sobczak
    ><s...@g...com> wrote:
    >
    >>On 2
    >>Potrzebna jest taka mapa: Map<Long, Item> (ewentualnie jej
    >>WeakReference warianty). W tej mapie kluczami są Longi a wpisy mają
    >>być usunięte po porzuceniu wartości Item.
    >>
    >
    >Ja mialem na mysli WeakHashMap w ktorej kluczem jest Item a waroscia
    >slaba referencja na klucz. Item musi miec "equals" zaomplementowane na
    >podstawie rownosci ID, a do wyszukiwania tzreba zrobic "dummy" Item z
    >zainicjowana wartoscia ID taka jakiej poszukujemy
    >
    Napisalem krotki programik zeby pokazac o co mi chodzi

    public class Test {

    public static void main(String[] args) {
    WeakHashMap<Item, WeakReference<Item>> m = new
    WeakHashMap<Item, WeakReference<Item>>();
    //
    // Pierwszy element
    //
    Item item1 = new Item((long)20);
    m.put(item1, new WeakReference<Item>(item1));
    //
    // Wyciagnij
    //
    Item dummy = new Item((long)20);
    System.out.println(m.get(dummy).get());
    //
    // Odetnij referencje
    //
    item1 = null;
    //
    // Wstaw nowy element
    //
    Item item2 = new Item((long)30);
    m.put(item2, new WeakReference<Item>(item1));
    //
    // Powiedz gc zeby sie uaktywnil
    //
    System.gc();
    //
    // Sprawdz czy element jest
    //
    if(m.get(dummy) == null) {
    System.err.println("null");
    } else {
    System.out.println(m.get(dummy).get());
    }
    }
    }

    public class Item {
    private Long _ID = null;

    public Item(Long key) {
    this._ID = key;
    }

    public long getkey() {
    return this._ID;
    }

    public int hashCode() {
    return this._ID.hashCode();
    }

    public String toString() {
    return "ID " + this._ID;
    }

    public boolean equals(Object object) {
    if(object == null) {
    return false;
    }
    return this._ID.equals(((Item)object)._ID);
    }
    }

    Program pisze

    ID 20
    null

    equals jes tzrobione tak sobie, ale do tego testu wystarczy

    mam nadzieje ze sie nie pomylilem nigdzie :)

    A.L.


  • 44. Data: 2009-07-28 20:01:33
    Temat: Re: Opowiadanie o GC
    Od: A.L. <a...@a...com>

    On Tue, 28 Jul 2009 14:53:22 -0500, A.L. <a...@a...com> wrote:

    >On Tue, 28 Jul 2009 07:34:11 -0500, A.L. <a...@a...com> wrote:
    >
    >>On Mon, 27 Jul 2009 13:36:43 -0700 (PDT), Maciej Sobczak
    >><s...@g...com> wrote:
    >>
    >>>On 2
    >>>Potrzebna jest taka mapa: Map<Long, Item> (ewentualnie jej
    >>>WeakReference warianty). W tej mapie kluczami są Longi a wpisy mają
    >>>być usunięte po porzuceniu wartości Item.
    >>>
    >>
    >>Ja mialem na mysli WeakHashMap w ktorej kluczem jest Item a waroscia
    >>slaba referencja na klucz. Item musi miec "equals" zaomplementowane na
    >>podstawie rownosci ID, a do wyszukiwania tzreba zrobic "dummy" Item z
    >>zainicjowana wartoscia ID taka jakiej poszukujemy
    >>
    >Napisalem krotki programik zeby pokazac o co mi chodzi
    >
    >public class Test {
    >
    > public static void main(String[] args) {
    > WeakHashMap<Item, WeakReference<Item>> m = new
    >WeakHashMap<Item, WeakReference<Item>>();
    > //
    > // Pierwszy element
    > //
    > Item item1 = new Item((long)20);
    > m.put(item1, new WeakReference<Item>(item1));
    > //
    > // Wyciagnij
    > //
    > Item dummy = new Item((long)20);
    > System.out.println(m.get(dummy).get());
    > //
    > // Odetnij referencje
    > //
    > item1 = null;
    > //
    > // Wstaw nowy element
    > //
    > Item item2 = new Item((long)30);
    > m.put(item2, new WeakReference<Item>(item1));
    >

    No, pomylilem sie. Powinno byc

    m.put(item2, new WeakReference<Item>(item2));

    Ale to nie ma znaczenia dla ogolnej koncepcji...

    A.L.


  • 45. Data: 2009-07-29 07:04:53
    Temat: Re: Opowiadanie o GC
    Od: Paweł Kierski <n...@p...net>

    Marcin 'Qrczak' Kowalczyk wrote:
    > On Jul 28, 2:48 pm, Paweł Kierski <n...@p...net> wrote:
    >
    >> Jakby jeszcze takie destruktory miały wsparcie w języku w kierunku
    >> deterministycznego/jak najszybszego wywoływania, to byłoby super.
    >> Wystarczyłoby chyba wywołanie takiego destruktora w momencie porzucania
    >> obiektu, a nie (jak finalizatora) w momencie usuwania przez GC.
    >
    > Nie da się tego pogodzić z efektywnym GC. Nie wiadomo, kiedy dokładnie
    > obiekt jest "porzucany", bo do obiektu mogą się odwoływać różne inne
    > obiekty, więc potencjalnie trzeba by to wiedzieć o wszystkich - czyli
    > trzeba by uaktualniać wiedzę o dostępnych obiektach na bieżąco, przy
    > każdej operacji, zamiast amortyzowania tego po wielu operacjach.

    A gdyby trzymać taką wiedzę tylko o pewnych klasach obiektów? Np.
    implementujących "szybki" destruktor?

    --
    Paweł Kierski
    n...@p...net


  • 46. Data: 2009-07-29 07:42:05
    Temat: Re: Opowiadanie o GC
    Od: Maciej Sobczak <s...@g...com>

    On 28 Lip, 21:53, A.L. <a...@a...com> wrote:

    > Napisalem krotki programik zeby pokazac o co mi chodzi
    >
    > public class Test {
    >
    >     public static void main(String[] args) {
    >        WeakHashMap<Item, WeakReference<Item>> m = new
    > WeakHashMap<Item, WeakReference<Item>>();

    [...]

    Teraz rozumiem. Tak, to ciekawy pomysł. Trochę psuje interfejs klasy
    Item - ta klasa i mapa są w różnych pakietach, przez co dodatkowy
    konstruktor Item musiałby być publiczny, wbrew innym założeniom tego
    projektu. Można z tym powalczyć psując projekt jeszcze gdzieś indziej
    (np. przez hierarchię klas, użycie różnych typów w mapie i
    rzutowanie), ale koncepcyjnie jest to jakieś rozwiązanie.

    --
    Maciej Sobczak * www.msobczak.com * www.inspirel.com


  • 47. Data: 2009-07-29 08:45:28
    Temat: Re: Opowiadanie o GC
    Od: Piotr Lipski <l...@g...com>

    > Użyj mapy gdzie klucze też mogą być słabymi referencjami.

    miało być: _wartości_ też mogą...

    PL


  • 48. Data: 2009-07-29 09:47:29
    Temat: Re: Opowiadanie o GC
    Od: Krzysiek Kowaliczek <k...@g...com>

    Użytkownik Paweł Kierski napisał:
    > Marcin 'Qrczak' Kowalczyk wrote:
    >> Nie da się tego pogodzić z efektywnym GC. Nie wiadomo, kiedy dokładnie
    >> obiekt jest "porzucany", bo do obiektu mogą się odwoływać różne inne
    >> obiekty, więc potencjalnie trzeba by to wiedzieć o wszystkich - czyli
    >> trzeba by uaktualniać wiedzę o dostępnych obiektach na bieżąco, przy
    >> każdej operacji, zamiast amortyzowania tego po wielu operacjach.
    >
    > A gdyby trzymać taką wiedzę tylko o pewnych klasach obiektów? Np.
    > implementujących "szybki" destruktor?
    >

    W praktyce i tak należałoby trzymać taką wiedzę dla wszystkich obiektów.
    Można by zrobić GC w oparciu o zliczanie referencji z dodatkowo fazą
    usuwającą cykle. Taki GC jest np. w Pythonie. W każdym razie unikając
    cykli da się w tym przypadku uzyskać deterministyczne wołanie
    destruktorów. Zastanawiają mnie koszty takiego rozwiązania, ponieważ
    nie słyszałem, aby to rozwiązanie było powszechnie stosowane w Java VM.

    Pozdrawiam
    KK


  • 49. Data: 2009-07-29 12:00:57
    Temat: Re: Opowiadanie o GC
    Od: "Marcin 'Qrczak' Kowalczyk" <q...@k...org.pl>

    On Jul 29, 9:04 am, Paweł Kierski <n...@p...net> wrote:

    > > Nie da się tego pogodzić z efektywnym GC. Nie wiadomo, kiedy dokładnie
    > > obiekt jest "porzucany", bo do obiektu mogą się odwoływać różne inne
    > > obiekty, więc potencjalnie trzeba by to wiedzieć o wszystkich - czyli
    > > trzeba by uaktualniać wiedzę o dostępnych obiektach na bieżąco, przy
    > > każdej operacji, zamiast amortyzowania tego po wielu operacjach.
    >
    >    A gdyby trzymać taką wiedzę tylko o pewnych klasach obiektów? Np.
    > implementujących "szybki" destruktor?

    Przynależność do tej klasy byłaby zaraźliwa. Rozważ takie przypadki:

    - Typ obiektu nie jest statycznie znany. Nie wiadomo, czy go śledzić.

    - Obiektem jest obiekt funkcyjny, do którego środowiska należy obiekt,
    który trzeba śledzić (ten fakt nie jest widoczny w typie funkcji). To
    jest szczególny przypadek poprzedniego punktu.

    Trzeba by więc albo śledzić mnóstwo obiektów niepotrzebnie, kiedy
    statycznie nie wiadomo, czy rzeczywiście trzeba (tak robi kanoniczna
    implementacja Pythona), albo wprowadzać podział w systemie typów na
    dwa światy z utrudnioną komunikacją między nimi, w szczególności
    zabronić odśmiecanym obiektom odwoływania się do nieodśmiecanych
    (chyba tak jest w C++/CLI).


  • 50. Data: 2009-07-29 13:14:58
    Temat: Re: Opowiadanie o GC
    Od: A.L. <a...@a...com>

    On Wed, 29 Jul 2009 00:42:05 -0700 (PDT), Maciej Sobczak
    <s...@g...com> wrote:

    >On 28 Lip, 21:53, A.L. <a...@a...com> wrote:
    >
    >> Napisalem krotki programik zeby pokazac o co mi chodzi
    >>
    >> public class Test {
    >>
    >>     public static void main(String[] args) {
    >>        WeakHashMap<Item, WeakReference<Item>> m = new
    >> WeakHashMap<Item, WeakReference<Item>>();
    >
    >[...]
    >
    >Teraz rozumiem. Tak, to ciekawy pomysł. Trochę psuje interfejs klasy
    >Item - ta klasa i mapa są w różnych pakietach, przez co dodatkowy
    >konstruktor Item musiałby być publiczny, wbrew innym założeniom tego
    >projektu. Można z tym powalczyć psując projekt jeszcze gdzieś indziej
    >(np. przez hierarchię klas, użycie różnych typów w mapie i
    >rzutowanie), ale koncepcyjnie jest to jakieś rozwiązanie.

    Do kreowania "dummy" ja bym bie robil konstruktora ale statyczna
    metode createKey. Na dodatek, wystarczy jeden egzemplarz "dummy"
    jeseli zrobimy druga methode umozliwiajaca zmiane ID

    A.L.

strony : 1 ... 4 . [ 5 ] . 6 ... 8


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: