源代码如下,是一个很简单的程序。importjava.awt.FlowLayout;importjava.awt.Image;importjava.io.File;importjava.io.IOException;importjava.util.Vector;importjavax.imageio.Ima...
源代码如下,是一个很简单的程序。
import java.awt.FlowLayout;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
class Test extends JFrame implements Runnable {
Vector buttons = new Vector();
public Test() {
setLayout(new FlowLayout());
for (int i = 0; i < 20; i++) {
buttons.add(new JButton());
add(buttons.elementAt(i));
}
setBounds(100, 100, 800, 700);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread t = new Thread(this);
t.start();
}
public static void main(String[] args) {
new Test();
}
@Override
public void run() {
File f = new File("./img");
File[] c = f.listFiles();
File t;
Image img;
ImageIcon ico;
for (int i = 0; i < 20; i++) {
t = c[i];
try {
img = ImageIO.read(t);
img = img.getScaledInstance(-1, 72, Image.SCALE_FAST);
ico = new ImageIcon(img);
buttons.elementAt(i).setIcon(ico);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我要做的就是将某文件夹中的图片缩略图显示在按钮上。当载入的是一些较小的图片时,运行没有问题,但内存占用比想象中要大;当载入的是1800万像素的数码相片时,载入到后期提示“Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space”,有两张图片的缩略图无法显示;当我载入一些72×72的小图标时,则瞬间完成,内存占用很小。
按理来说,我在run()里面每一次载入的图片在循环过后应该会被垃圾回收掉,当缩略图载入完毕之后在内存中的应该只有生成的icon而已,可是从上面的情况看来,处理过程中生成的所有图片都被保留着。
这是垃圾回收机制的漏洞吗?还是我搞错了什么?恳请高手解答!
展开