Kezdőlap › Fórumok › Programozás › Java – dispose
- This topic has 20 hozzászólás, 5 résztvevő, and was last updated 19 years, 11 months telt el by
kl223.
-
SzerzőBejegyzés
-
2005-08-08-13:43 #2025685
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.2005-08-08-14:24 #2025686Hi!
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…
2005-08-08-14:48 #2025687http://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 :)))2005-08-08-15:15 #2025688Most 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.2005-08-08-15:19 #2025689Egyé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
2005-08-08-15:30 #2025690„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áltamMost 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…
2005-08-08-15:39 #2025691Hogy 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.2005-08-08-15:45 #2025692Egy 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!2005-08-08-16:37 #2025693Egy 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
2005-08-08-18:07 #2025694„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 😉 )
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz