2011-09-11 11 views
8

Sto scrivendo un programma di test come segue:Lo smaltimento di un JFrame causa perdite di memoria?

  1. Quando un utente fa clic sul pulsante A, si apre 50 JFrames.
  2. Quando l'utente fa clic sul pulsante B Dispone tutte JFrames mostrati facendo clic sul pulsante A.

Trovo che la memoria non diminuisce dopo aver cliccato il tasto B. ho deciso questa operazione utilizzando il Task Manager, Ctrl +alt + del in Windows e controllare l'utilizzo della memoria di "java".

+0

Alcuni codici ci aiuteranno sicuramente ... –

+1

Vedere [Rimuovi contenitore di primo livello in runtime] (http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime/6310284# 6.310.284). – trashgod

+1

Il mio codice non è niente di speciale. Creazione di JFrame con il nuovo JFrame. Smaltilo chiamando dispose() – Bear

risposta

11

Proprio così, niente da fare, non è in grado di risolvere che (non solo in Java PL),

1) in realtà non creare un sacco di Top-Level Containers su Runtime/volare, perché sono mai ultimati, e fino istanza corrente JVM esce, e questi oggetti mai stato GC'ed solo la loro Grapfics2D

2) myContainer#dispose() su runtime è stessa per esempio JVM corrente come myContainer#setVisible(false) nei collegamenti con JVM disponibili e utilizzati Memory

3) creare un solo poche Top-Level Containers (massima visualizzata contemporaneamente), il riutilizzo, ma messi lì JPanel come 1.st JComponent e chiamano myPanel#removeAll(), altrimenti si rimuovono RootPane e dal contenitore rimane solo il bordo delle :-) sarebbe traslucido

4) partialy è possibile ridurre JVM utilizzata memoria dalla chiamata GC, ma proprio returs importo dal Graphics2D e Garbage non funziona immediatelly,

5) più here informazioni utili here

+0

grazie mille. Ma non capisco il suggerimento 3. – Bear

+0

btw, Java conosce il problema? – Bear

+0

@Bear hai due scelte 1) crea tre - quattro contenitori di primo livello, 1 °. sarebbe JFrame altro JDialog (anche con Modality) o JWindow, 2) o cercare CardLayout http://download.oracle.com/javase/tutorial/uiswing/layout/card.html e quindi passare le Carte invece di creare Top- Contenitori di livello :-) – mKorbel

2

Senza alcun codice non possiamo aiutarti molto ... stai chiamando jFrame. dispose()?

pubblico Dispose void()

Rilascia tutte le risorse utilizzate nativa dello schermo da questa finestra, le sue sottocomponenti, e tutti i suoi figli di proprietà. Quella è, le risorse per questi componenti saranno distrutte, qualsiasi memoria che consumano verrà restituita al sistema operativo e saranno contrassegnate come non visualizzabili.

Maggiori informazioni sono disponibili here

0

Se esiste un riferimento forte alla radice GC (Garbage Collector) dal frame, se si chiama il metodo di eliminazione, non viene raccolta la garbage collection, quindi non è possibile vedere alcuna modifica della memoria dopo aver smaltito tutto le cornici. Se vuoi memoria, da cose che dovresti rilasciare, allora devi raccogliere i frame.