Java – dispose

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

10 bejegyzés megtekintése - 1-10 / 21
  • Szerző
    Bejegyzés
  • #2025685
    begyu
    Felhasználó

      Mivel nagy méretû képekbõl sokat tárolnék a memóriában szükségem lenne arra, hogy a nem használt képek helye felszabaduljon a memóriában.

      A dialog ablak bezárásával egy byte-tal sem lesz könnyebb a memória.
      (Elvileg tele van a net ezzel a problémával, de sajnos semmi nem használt…:()
      Nem hiszem, hogy hagyok elvarratlan szálakat…bár ki tudja.

      Sajnos nem tudok segíteni, de együttérzek veled! Mióta programokat írok, a legnagyobb szívás mindig a memória-felszabadítás volt. Volt, hogy debuggal sem derült ki a hiba.
      Nekem általában az OOP kódok okoztak több gondot, talán azért, mert kicsi vagyok és még csak nem is sejtem, hogy mikor mi fut.

      #2025686
      kl223
      Felhasználó

        Hi!

        A Garbage Collector olyan objektumokat gyûjt össze, amikre már nincs egyáltalán semmilyen hivatkozás.
        Elméletileg (ha jól tudom) a dispose() az csak annyit csinál, hogy eltünteti a képernyõrõl, de attól még a referenciát az adott objektumra nem szünteti meg.
        (mint pl. ha egy JDialog-ot is megjelenítünk, majd dispose(), attól még a JDialog objektum használható marad, nem tûnnek el a változói, szal marad referencia (!!) és késõbb újra meg lehet jeleníteni.)

        Szal nem látom a teljes kódodat, de szvsz itt az a megoldás lehetséges, hogy a dispose()olt objektum referenciáját még nullra is állítod, majd utána System.gc().

        Persze ez csak tipp, de én erre tapogatóznék elõször a helyedben…

        #2025687
        pointux
        Felhasználó

          http://java.sun.com/j2se/1.5.0/docs/api/ja….html#dispose()

          Egyébként a finalize-al is csináltam.
          Egy java forumban azt olvastam, hogy a nem használt objektumok címét módosítjam null-ra, mert akkor a gc szemétnek ítéli – bár spec. marhaságnak gondoltam -, de azért kipróbáltam.

          „Szal nem látom a teljes kódodat, de szvsz itt az a megoldás lehetséges, hogy a dispose()olt objektum referenciáját még nullra is állítod, majd utána System.gc().”
          Azzal sem jött be.
          Mondjuk a teljes kód egy kicsit hosszú.

          „A Garbage Collector olyan objektumokat gyûjt össze, amikre már nincs egyáltalán semmilyen hivatkozás.”
          Ezaz, hogy vajh mi lehet :)))

          #2025688
          pointux
          Felhasználó

            Most már idáig leegyszerûsítettem:

            Code:
            public class ImageFrame extends javax.swing.JDialog {
               public ImageFrame(String imageName) {
                   initComponents();
                   BufferedImage SBImg;
                   SBImg = null;
                   try {
                       File file = new File(imageName);
                       SBImg = ImageIO.read(file);
                   } catch (IOException e) {
                       
                       ErrorDialog errordialog = new ErrorDialog(„Error: Unable to load file: ” + imageName);
                       errordialog.show();
                   }

               private void initComponents() {
               …
               }

               private void closeDialog(java.awt.event.WindowEvent evt) {
                   setVisible(false);
                   ImPerAtor.imp.CloseAction();
                   dispose();
                   try{
                       finalize();
                   } catch(java.lang.Throwable e) {
                       System.out.println(„Error”);
                   }
                   System.gc();
               }
            }

            benyomtam egy finalize-t is hátha…

            A fõprogramban meg van egy csomó gomb, menü stb, és ki lehet választani egy file-t és akkor ezt indítom:

            Code:
            ImageFrame ifr = new ImageFrame(this, file.getAbsolutePath());
            ifr.setVisible( true );
            active_frame=ifr;
            setTitle(„Programnév – ” + ifr.image_name);

            Aztán így hívom meg a bezáró függvényt, a main programrészbõl (vagy szimplán a bezáró ikonra lehet kattintani):

            Code:
               private void jMenuItem_CloseActionPerformed(java.awt.event.ActionEvent evt) {
                   active_frame.close();
               }
               
               private void jButton_CloseActionPerformed(java.awt.event.ActionEvent evt) {
                   active_frame.close();
               }

            Gyakorlatilag már minden itt van, amivel közvetlen kapcsolatba léphet a BufferedImage ablaka.
            Esetleg az active_frame változó lehet gond? Bár az mindig az aktuális frame-re mutat – ha nem azt zárom, hanem egy másikat akkor sem szabadul fel memória.

            #2025689
            kl223
            Felhasználó

              Egyébként a finalize-al is csináltam.
              Egy java forumban azt olvastam, hogy a nem használt objektumok címét módosítjam null-ra, mert akkor a gc szemétnek ítéli – bár spec. marhaságnak gondoltam -, de azért kipróbáltam.

              nem egészen értelek… a „nem használt” objektumok címét persze, h nullra kell állítani.
              Illetve sokszor olyan maga a program, hogy felülírja ezeket a címeket, mert a változót újra felhasználja. Amíg van akármilyen hivatkozás egy objektumra, nem fog törlõdni.
              finalize-vel? hm. azt ugye tudod, hogy a finalize-t a szemétgyûjtõ hívja meg, mielõtt végrehajtaná rajta a törlést. De ennek nincs konkrét idõpontja, ellentétben pl. a C++al. Hanem a felhasználás után vmikor késõbb, illetve a legelsõ System.gc() meghívásakor.
              Szal akkor mit is csináltál abban? Szvsz semmit. Mert ha odakerül a vezérlés, akkor már sínen vagy, az adott objektum rövidesen törlõdni fog. Ha meg nem törlõdik, akkor a finalize nem hajtódik végre. (vagy az is lehet, h vmit félreértettem/te nem magyaráztál el vmit pontosan, mert ez így érdekes… namind1)

              „Szal nem látom a teljes kódodat, de szvsz itt az a megoldás lehetséges, hogy a dispose()olt objektum referenciáját még nullra is állítod, majd utána System.gc().”
              Azzal sem jött be.
              Mondjuk a teljes kód egy kicsit hosszú.
              [align=right][snapback]144600[/snapback][/align]

              Biiiiiztoooos? 😉 Hm. szvsz akkor máshol van a hiba, nem itt… vhol marad hivatkozás ezekre az objektumokra, így a GC nem törli õket.

              kl223

              #2025690
              pointux
              Felhasználó

                „a „nem használt” objektumok címét persze, h nullra kell állítani.”
                Azt is kipróbáltam. (Bár ez nyílván veszélyes, ha még használva van…), nem használt.

                „hm. azt ugye tudod, hogy a finalize-t a szemétgyûjtõ hívja meg”
                tudom, de már minden hülyeséget kipróbáltam

                Most még a legutóbb nem nulláztam ki, még azt kipróbálom. Különben a sun példaprogramja is benthagyja a képet…

                #2025691
                pointux
                Felhasználó

                  Hogy ez mikor történt…
                  Ha bezárom az ablakot és megnyitok egy újat, akkor – legalábbis elsõ ránézésre – nem fogy több memória 🙂 Ez +:). Csak nem tudom mitõl, mert most figyeltem meg – eddig nem így volt. Szóval a lényeg, hogy nem fogy egyelõre tovább a memória.

                  #2025692
                  pointux
                  Felhasználó

                    Egy biztos, – a mostani tapasztalat szerint – a kinullázás nem kell és ha sokáig nyitogatom, csukogatom az ablakokat, akkor még egyszer le is megy a memória.
                    (Mondjuk most már tényleg semmi hiv. úgyhogy nem csoda.)
                    De kössz!

                    #2025693
                    kl223
                    Felhasználó

                      Egy biztos, – a mostani tapasztalat szerint – a kinullázás nem kell és ha sokáig nyitogatom, csukogatom az ablakokat, akkor még egyszer le is megy a memória.
                      (Mondjuk most már tényleg semmi hiv. úgyhogy nem csoda.)
                      De kössz!
                      [align=right][snapback]144610[/snapback][/align]

                      nm. a java néha produkál fura dolgokat, ez igaz, de ez csak azért van, mert ilyen komplex…. mind1. hozzá kell szokni. idomulni kell hozzá… 😉

                      kl223

                      #2025694
                      pointux
                      Felhasználó

                        „nm. a java néha produkál fura dolgokat, ez igaz, de ez csak azért van, mert ilyen komplex…. mind1. hozzá kell szokni. idomulni kell hozzá…”
                        Minden programnyelvnek van valami *%4/$.

                        Mindegy nem az volt a hiba, hanem ha a jLabel.setIcon() lefut. Még nem tudom hogy szüntetem meg, de most átírom a kódot. (Egyelõre a jDialog.removeAll() nem használt, de majd az új kódnál meglátjuk. Bár még nem értem, de legalább már tudom a helyét 😉 )

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