8

I am writing a test program as follows:

  1. When a user clicks button A, it opens 50 JFrames.
  2. When the user clicks button B it disposes all JFrames shown by clicking button A.

I find that the memory does not decrease after clicking button B. I determined this using the Task Manager, ctrl+alt+del in Windows, and checking the memory usage of "java".

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Bear
  • 5,138
  • 5
  • 50
  • 80
  • Some code will help us definitely... – Petar Minchev Sep 11 '11 at 07:54
  • 1
    See [Remove Top-Level Container on Runtime](http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime/6310284#6310284). – trashgod Sep 11 '11 at 08:11
  • 1
    My code is nothing special. Creating JFrame by new JFrame. Dispose it by calling dispose() – Bear Sep 11 '11 at 08:35
  • 1
    Also, don't forget that Garbage Collection occurs only when needed, not right after you have disposed of objects. Finally, make sure that your code doesn't retain references to the 50 frames that were just disposed. – jfpoilpret Sep 11 '11 at 08:48
  • @jfpoilpret thanks for valuable input – mKorbel Sep 11 '11 at 10:09

3 Answers3

11

That's right, no way, not able to solve that (not only in Java PL),

1) really don't create lots of Top-Level Containers on Runtime/Fly, because they are never finalized, and until current JVM instance exits, and these Object never been GC'ed only their Grapfics2D

2) myContainer#dispose() on Runtime is same for current JVM instance as myContainer#setVisible(false) in connections with JVM available and used Memory

3) create only few Top-Level Containers (maximum simultaneously displayed ), re-use that, but put there JPanel as 1.st JComponent and call myPanel#removeAll(), otherwise you'll remove RootPane and from your Container stays only Borders :-) would be translucent

4) partialy is possible to reduce JVM used Memory by call GC, but just returs amount from Graphics2D and Garbage doesn't works immediatelly,

5) more here usefull info here

Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • btw, do Java knows the problem? – Bear Sep 11 '11 at 09:02
  • @Bear you have two choises 1) create three - four Top-Level Containers, 1st. would be JFrame other JDialog(with Modality too) or JWindow, 2) or look for CardLayout http://download.oracle.com/javase/tutorial/uiswing/layout/card.html and then switch betweens Cards instead of create Top-Level Containers :-) – mKorbel Sep 11 '11 at 09:19
  • @Bear btw, do Java knows the problem?, did you ever seen buch of Windows that produced from another aplication, as I said not Java rellated issue, beacuse Top-Level Containers comings from Native OS, just their contens is from concreted Programing Language – mKorbel Sep 11 '11 at 09:23
2

Without any code we can't help you much... are you calling jFrame.dispose()?

public void dispose()

Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.

More information available here

npinti
  • 51,780
  • 5
  • 72
  • 96
0

If there is a strong reference to GC(garbage collector) root from your frame, then if you called dispose method, it does not get garbage collected, so you can't see any memory changes after you dispose all of the frames. If you want memory, from stuff that you should release, then you need to garbage collect the frames.

Draken
  • 3,134
  • 13
  • 34
  • 54