今天我有点用Java打开/缩放/显示图像,并编写了一些代码来打开图像文件,随机缩放并显示一小段时间。在java中显示图像时的内存泄漏(?)
问题是:显示它像100-1000次后,我的“javaw.exe”使用的内存增长和增长,它甚至达到1 GB的内存空间。
我不知道我的代码中的内存泄漏的地方是因为唯一的内存吃东西是我的picures,只有2(原始图像和得到缩放的人,它总是分配给相同的变量温度),所以老年人应该被GC挑选出来),也许你们可以看看它,它非常简单。
1)您可以选择从硬盘
2)被随机缩放
3)及其在很短的时间量所显示的图像,然后消失
4)到2 )
要缩放我用这个库中的图片:http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.imgscalr.Scalr;
public static void main(String[] args) throws IOException, InterruptedException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
BufferedImage originalImage = ImageIO.read(chooser.getSelectedFile());
BufferedImage temp;
while(true){
int width = (int) ((Math.random()*1000)+1);
int height = (int) ((Math.random()*1000)+1);
Thread.sleep(1000);
temp = Scalr.resize(originalImage,Scalr.Mode.FIT_EXACT, width, height);
showImage(temp, 800);
}
}
static void showImage(BufferedImage v,long length) throws InterruptedException {
JFrame frame = new JFrame();
frame.add(new JLabel(new ImageIcon(v)));
frame.setSize(v.getWidth(), v.getHeight());
frame.setVisible(true);
Thread.sleep(length);
frame.setVisible(false);
}
这是我第一次在这里发帖,所以如果我不清楚请提问
在此先感谢!
编辑:我监视的存储器javaw.exe的正需要
显示1张图片:75M显示 100张图片显示330M 1000图片:2,4G
编辑2:
我现在已经应用了您的有用建议,但我仍然有越来越多的内存,并且我的图像不再显示。JFrames为空。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import org.imgscalr.Scalr;
public class App {
public static void main(String[] args) throws IOException, InterruptedException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
BufferedImage originalImage = ImageIO.read(chooser.getSelectedFile());
BufferedImage temp;
JFrame frame = new JFrame();
while(true){
int width = (int) ((Math.random()*1000)+1);
int height = (int) ((Math.random()*1000)+1);
Thread.sleep(1000);
temp = Scalr.resize(originalImage,Scalr.Mode.FIT_EXACT, width, height);
showImage(temp, 500, frame);
}
}
static void showImage(BufferedImage v,long length, JFrame frame) throws InterruptedException {
SwingUtilities.invokeLater(
() -> {
frame.removeAll();
frame.revalidate();
frame.repaint();
frame.add(new JLabel(new ImageIcon(v)));
frame.setSize(v.getWidth(), v.getHeight());
frame.setVisible(true);
try {
Thread.sleep(length);
} catch (Exception e) {}
frame.setVisible(false);
frame.dispose();
});
}
}
也许我把你的建议放在我的代码错误的地方。
您给Java多少内存?它最终会耗尽内存,还是最终会收集垃圾回收? – 2014-11-05 15:00:28
您正在循环中创建新框架,但从不关闭它们(只是使它们不可见),并且每个框架都有一个调整大小的图像。你应该得到内存泄漏。垃圾收集永远不会发生,只要这些帧在附近。另外,你在主线程中。这永远不会起作用,你最终将耗尽内存并使虚拟机崩溃。 – mttdbrd 2014-11-05 15:00:42
您可能必须修改vm配置文件并为其提供更多内存。 – ha9u63ar 2014-11-05 15:03:39