Java – dispose

Kezdőlap Fórumok Programozás Java – dispose

10 bejegyzés megtekintése - 11-20 / 21
  • Szerző
    Bejegyzés
  • #2025695
    kl223
    Felhasználó

      B) naigen.

      De egyébként pl. Delphinél is voltak anno nekem oanok, hogy szépen kigondolom, hogy fogom csinálni, de õ kitalálta, hogy vmi szabálytalan dolgot csináltam (pl. változókonverziókkal mindig szívtam, etc), amit nem lehet kikerülni, ezért az egész tervemnek annyi….

      javaban azért kevesebb van ebbõl szerencsére, meg sokkal jobb a doksi is hozzá…

      kl223

      #2025696
      ds
      Felhasználó

        1-2 észrevétel:
        -a dispose nem szünteti meg az objektumot, csak a natív erõforrsáokat szabadítja fel
        -a gc nem „köteles” csinálni semmit amíg van memóra
        -a finalize hívása nem jelent semmit (vagyis az hajtódik végre amit a finalize metódusba írtál, de más nem történik != C destruktor!!! )
        -a null -ra állítás akkor kell, ha referencia marad rá, de már nem használod (jó példa a stack tömbbel megvalósítása, ugye a stack pointer alatti(vagy fölötti) tömbelemek már nem használtak de a tömbben a ref megmarad amíg felül nem írod, itt jól jöhet a nullázás)

        esetleg (bár ebben az esetben nem látom konkrétan értelmét, de talán active_frame lehetne) weakrefernce használata

        #2025697
        kl223
        Felhasználó

          1-2 észrevétel:
          -a dispose nem szünteti meg az objektumot, csak a natív erõforrsáokat szabadítja fel

          így van!

          -a gc nem „köteles” csinálni semmit amíg van memóra

          elv ha meghívjük explicit módon (System.gc()) akkor összetakarít mindent, amit csak lehet:
          SUN Java System.gc() referencia: „When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.”

          -a finalize hívása nem jelent semmit (vagyis az hajtódik végre amit a finalize metódusba írtál, de más nem történik != C destruktor!!! )

          Hm. ezt nem is tudtam… mindenesetre eddig nem volt rá szükség, hogy a finalize-t explicit módon hívjam. Felmerül azonban a kérdés ekkor, hogy egy objektum belülrõl tudja-e törölni saját magát?
          Mert gondolom a this=null; nem fog menni… 🙂
          Mert más módot nem látok arra, hogy az objektum referenciáját átállítsuk nullra. Ill ezt se, mert ez se hiszem, hogy megy… 🙂

          -a null -ra állítás akkor kell, ha referencia marad rá, de már nem használod (jó példa a stack tömbbel megvalósítása, ugye a stack pointer alatti(vagy fölötti) tömbelemek már nem használtak de a tömbben a ref megmarad amíg felül nem írod, itt jól jöhet a nullázás)

          esetleg (bár ebben az esetben nem látom konkrétan értelmét, de talán active_frame lehetne) weakrefernce használata
          [align=right][snapback]144647[/snapback][/align]

          hát elv mi is a gyenge referencia? Ha jól tudom épp az a lényege, hogy azt a gc nem veszi figyelembe… de ez nem biztos, csak vmi rémlik…

          kl223

          #2025698
          ds
          Felhasználó

            így van!
            elv ha meghívjük explicit módon (System.gc()) akkor összetakarít mindent, amit csak lehet:
            SUN Java System.gc() referencia: „When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.”

            „best effort” 🙂 és az elõzõ mondatban is suggest van…

            Hm. ezt nem is tudtam… mindenesetre eddig nem volt rá szükség, hogy a finalize-t explicit módon hívjam. Felmerül azonban a kérdés ekkor, hogy egy objektum belülrõl tudja-e törölni saját magát?

            nem, de ez miért kellene??

            Mert gondolom a this=null; nem fog menni… 🙂

            a this final…

            hát elv mi is a gyenge referencia? Ha jól tudom épp az a lényege, hogy azt a gc nem veszi figyelembe… de ez nem biztos, csak vmi rémlik…

            ha valamire csak gyenge ref van és kell mem azt automatikusan felszabadítja a gc

            #2025699
            pointux
            Felhasználó

              „a gc nem „köteles” csinálni semmit amíg van memóra”
              én is ebben reménykedem már csak azért is, mert
              „ha valamire csak gyenge ref van és kell mem azt automatikusan felszabadítja a gc”
              nem szabadul fel, vagy legalábbis nem mindig, meg ilyesmi – ugyanannál a kódnál – pl. ilyen esetben sem:
              class…
              …void …() {
              … valami // ennek kéne felszabadulnia
              }

              Ami lehet, hogy nem is meglepõ, mert a java-nak a filozófiája, hogy nem szabadítgatunk menetközben, mert az nagyon lassít, de hogy gc-re sem szabadul fel, az meglepõ. (Lehet, hogy a fizika törvényei nálam felsülnek :), de így van… a sun példaprogramával is így van.)
              Számomra ez egy kicsit furcsa, ugyanakkor teljesen logikus lenne, ha csak java lenne… bár lehet, hogy meg van oldva, hogy úgy kommunikál a host-tal, hogyha a hostnak memóriára van szüksége felszabadítja. (Bár ezt nem tudom, hogy lehet megoldani – nem ismerem a jvm-et.)

              „”best effort””
              Pont erre gondoltam: a legjobb nem a legjobb, csak a legjobb ami van :)))

              „this=null;”
              Hát ez elég fura lenne, mert innentõl kezdve már a függvény nem tudna befejezõdni/visszatérni. (Mert ugye ilyenkor még történik 3-4 processzor utasítás, ami elveszne az „éterben”. De egy „kártevõnek” kifejezetten ideális lenne :)))

              #2025700
              pointux
              Felhasználó


                Hát ez hihetetlen! Még ez is mûködik: string += „hello”;… Tudom egy újszülötnek minden új, de eszembe nem jutott volna kipróbálni, de most praktikus lett volna, úgyhogy legfeljebb mondom „hûjének” néz a fordító – erre megcsinálta.
                Tudom nem tartozik ide, de muszáj volt leírnom :)))

                #2025701
                kl223
                Felhasználó


                  Hát ez hihetetlen! Még ez is mûködik: string += „hello”;… Tudom egy újszülötnek minden új, de eszembe nem jutott volna kipróbálni, de most praktikus lett volna, úgyhogy legfeljebb mondom „hûjének” néz a fordító – erre megcsinálta.
                  Tudom nem tartozik ide, de muszáj volt leírnom :)))

                  [align=right][snapback]144731[/snapback][/align]

                  hehe 🙂 igen, mûxik, de a háttérben valójában StringBufferekkel oldja meg a rendszer az ien mûveleteket.
                  Ezért ha olyasmit csinálsz, hogy egy stringhez adnál hozzá egyenként karaktereket/szavakat, (pl. vmilyen ciklusban, etc) akkor érdemes StringBuffert explicit módon használni, és utána Stringet csinálni, mikor minden benne van, aminek benne kell lennie… 😉

                  kl223

                  #2025702
                  ds
                  Felhasználó

                    hehe 🙂 igen, mûxik, de a háttérben valójában StringBufferekkel oldja meg a rendszer az ien mûveleteket.
                    Ezért ha olyasmit csinálsz, hogy egy stringhez adnál hozzá egyenként karaktereket/szavakat, (pl. vmilyen ciklusban, etc) akkor érdemes StringBuffert explicit módon használni, és utána Stringet csinálni, mikor minden benne van, aminek benne kell lennie… 😉

                    kl223
                    [align=right][snapback]144768[/snapback][/align]

                    az a baj, hogy nem, hanem stringekkel oldja meg és mindig új objektumokat kell létrehoznia, mivel string imutable és így O(n^2), stringbufferrel meg lineáris, mondjuk két string összefûzésénél mind1, de for(int i=0;i<1000;i++) s+="a"; nem ideális 🙂

                    #2025703
                    pointux
                    Felhasználó

                      obj = new … esetén tovább nõ a program által foglalt memória, de a freeMemory() többet mutat. Ami viszont a leírás szerint a jvm-en belüli szabad memóriát jelenti.
                      Minnél több objektumot hozok létre és hagyok ott „szemétként”, annál több memóriát foglal a program, viszont annál többet mutat a freeMemory() is.
                      Ennek a tudatában kiszámoltam, hogy nálam a szemét tényleg szemét :).
                      Azt, hogy mikor fogja felszabadítani nem tudom ill. úgy gondolom, hogy a maxMemory()-nál. Azt meg gondolom valahol állítani lehet…

                      „for(int i=0;i<1000;i++) s+="a";"
                      Egyébként ez valóban elég ritka lehet :))))

                      #2025704
                      kl223
                      Felhasználó

                        az a baj, hogy nem, hanem stringekkel oldja meg és mindig új objektumokat kell létrehoznia, mivel string imutable és így O(n^2), stringbufferrel meg lineáris, mondjuk két string összefûzésénél mind1, de for(int i=0;i<1000;i++) s+="a"; nem ideális 🙂
                        [align=right][snapback]144849[/snapback][/align]

                        hm….

                        The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method.

                        Erre mondtam, hogy StringBufferekkel oldja meg a háttérben azt az összefûzést. A gond ott van, hogy a ciklus minden egyes iterációjában így újabb StringBuffert hoz létre. Ami nem egészséges a memóriára nézve. Ezért érdemes explicit módon az egész for ciklushoz egyetlen StringBuffert használni.

                        üdv!
                        kl223

                      10 bejegyzés megtekintése - 11-20 / 21
                      • Be kell jelentkezni a hozzászóláshoz.