Threads are not really a memory problem (about half of those 18 are just because you are in debug mode IIRC). The other ones have pretty obvious names (my guesses): AWT-Shutdown (to check if all windows dispose, then exit JVM), AWT-Windows (get events from the OS), Java2D disposer (image data clean up).
I don't know the program you're running but if it is based on the Netbeans platform that probably adds some extra memory requirement, but not 180MB. I guess most of the memory is either not used (just reserved) or is actual data taking up memory.
For comparison:
- a simple JFrame with a label and a button only needs ~2MB (runs with
-Xmx2MB, although visualvm show it has 8MB reserved (minimum on 64bit Windows?), <2MB used).
- a complex GUI program I develop with 70MB of libraries (jars) is after
starting ~35MB (where my guess is ~5-10MB just icons/images) and after
using all functionality (so almost all library code loaded, including
non GUI ones) ~100MB but that includes some data.
Breakdown:
- java.awt.image.BufferedImage#156 7.056.378
- java.awt.image.BufferedImage#415 6.639.738
- sun.misc.Launcher$AppClassLoader#1 3.386.545
- class com.ces.core.gui.help.WelcomeTab 627.256 (static image data here)
- class com.ces.util.resources.Translator 408.146 (basically all text displayed in the UI)
- sun.awt.AppContext#1 389.760
- java.awt.image.BufferedImage#161 326.120
About half looks like cached images (big background images :)) I left out the int[]/Object[]/HashMap.Entry[] which refers to the same data)
If you want to see the breakdown for you example app -> VisualVM -> Monitor -> Heap dump -> Find x biggest objects by retained size.