Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
764 views
in Technique[技术] by (71.8m points)

java - How do I get AppContext to release AWT components so they can be garbage collected?

My team is working on analyzing our Swing application to make sure everything is being garbage collected when it's no longer being used. We're running into an odd problem.

We are simply opening a new window (JFrame) and closing it. This frame contains an EmptyPanel class (which contains a short message saying there is no data) and a custom JMeunBar class. We don't interact with this at all - just close the window immediately.

Then, we force a garbage collection and do a heap dump.

Upon analysis of the heap dump, the JMenuBar isn't being garbage collected. It's being kept open from the GC Root sun.awt.AppContext.

How do we clean this up? Or is this something we don't have to worry about for some reason? We want to be diligent making sure our application cleans up after itself, but we don't want to spin our wheels on this either.

AppContext.mainAppContext contains a HashMap which contains a BasicPopupMenuUI.MenuKeyboardHelper instance. Inside this is a ComponentInputMapUIResource.menuInputMap which has this JMenuBar as a component.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

As discussed here there are a number of system resources that must be freed explicitly in the normal course of the JVM's operation. The graphics context's dispose() method is one example; the parent window's dispose() method is another. In either, the resource may be correctly released, but you may observe the heap before it has been finalized.

It's hard to generalize about what can be safely ignored, but one empirical approach is to exercise the target in a profiler. The first two graphs in this comparison show a small but steady increase in memory consumed by a certain method that is suspected of retaining resources. In contrast, the third chart shows flat memory use with periodic spikes of garbage collection activity. Below is the typical saw-tooth pattern of a visually "busy" program such as this game. Note that each cycle returns to the baseline.

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...