使用时出现内存不足异常javax.Swing
,这就是我所做的。我加载了 16 个 jpg(每个 70*70 像素)并有 16 个Jbuttons
. 我在一个循环中非常快速地将 的 设置为不同的 jpg,基本上与我的 CPU 可以处理的一样快ImageIcon
。JButtons
内存使用量急剧增加。问题是,我从未重新加载图像。只有 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 < 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 < 16; i ++){
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
buttons[i].setIcon(imgIcon[/*random num 1-16*/]);
});
}
}
}
}).start();
}
}
请忽略这里明显的反模式,因为我抽象出了新线程中发生的很多事情。