1

使用时出现内存不足异常javax.Swing,这就是我所做的。我加载了 16 个 jpg(每个 70*70 像素)并有 16 个Jbuttons. 我在一个循环中非常快速地将 的 设置为不同的 jpg,基本上与我的 CPU 可以处理的一样快ImageIconJButtons内存使用量急剧增加。问题是,我从未重新加载图像。只有 16 张图片,所有的作业都是通过引用传递的,对吧?我运行 Eclipse 内存分析器,这是我得到的:

“< 系统类加载器>”加载的“java.awt.image.FilteredImageSource”的一个实例占用了 703,066,368 (43.58%) 个字节。该实例由 sun.awt.image.ToolkitImage @ 0x7859cef60 引用,由“< system class loader >”加载。内存在“< system class loader>”加载的“java.util.Hashtable$Entry[]”的一个实例中累积。

关键字 java.awt.image.FilteredImageSource
java.util.Hashtable$Entry[]

我可以怀疑 Java 的 swing 实现中存在内存泄漏吗?有任何想法吗?

基本上代码如下所示:

    public class Test{
        private static ImageIcon[] imgIcon;
        private static JButton[] buttons;
        private static JFrame myFrame;
        public static void main(String[] args){
            myFrame = new JFrame(new GridLayout());
            for(int i = 0; i &lt 16; i ++){
                 imgIcon[i] = //load the imageIcons
                 buttons[i] = new JButton();
                 myFrame.add(buttons[i]);
            }
            myFrame.pack();
            myFrame.setVisible(true);
            new Thread(new Runnable(){
                @Override
                public void run(){
                    while(true){
                         for(int i = 0; i &lt 16; i ++){
                               SwingUtilities.invokeAndWait(new Runnable(){
                                       public void run(){
                                            buttons[i].setIcon(imgIcon[/*random num 1-16*/]);
                                       });
                         }
                     }
                    }
            }).start();
         }
    }

请忽略这里明显的反模式,因为我抽象出了新线程中发生的很多事情。

4

0 回答 0