我正在使用Java开发一款软件,它可以不断地对桌面截屏并将其保存在BufferedImage对象中,然后写入jpg文件。但是,在某个时刻,程序会导致java.lang.OutOfMemoryError: Java heap space异常。由于我已经将屏幕截图保存为文件,所以我不再需要内存中的以前的BufferedImage对象,因此可以将它们丢弃。但Java似乎无法识别这些对象,所以它们可能仍然存在于内存中。有没有办法从JVM的内存中删除这些对象,以便它不会耗尽内存?连续调用System.gc()可能没有帮助。有什么想法吗?
以下是参考代码:
以下是参考代码:
public BufferedImage getScreenShot() {
BufferedImage screenImage = null;
try {
GraphicsEnvironment ge= GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens=ge.getScreenDevices();
Rectangle allScreenBounds=new Rectangle();
for(GraphicsDevice screen: screens)
{
Rectangle screenbounds = screen.getDefaultConfiguration().getBounds();
allScreenBounds.width+=screenbounds.width;
allScreenBounds.height=Math.max(allScreenBounds.height, screenbounds.height);
}
Robot robot = new Robot();
screenImage = robot.createScreenCapture(allScreenBounds);
} catch (Exception ex) {
Logger.getLogger(Screen.class.getName()).log(Level.SEVERE, null, ex);
}
return screenImage;
}
然后,我只需使用一个循环不断地调用该方法来生成BufferedImage对象,将其调整大小,并像这样写入文件:
while(true){
FileImageOutputStream out = new FileImageOutputStream(f);
writer.setOutput(out);
IIOImage image = new IIOImage(ImageUtils.resize(getScreenShot(), width, height),null, null);
writer.write(null, image, iwp);
writer.dispose();
}