Я разрабатываю программное обеспечение на Java, которое постоянно делает снимки экрана рабочего стола, сохраняет их в объекте BufferedImage, а затем записывает в файлы jpg. В какой-то момент программа вызывает java.lang.OutOfMemoryError: Исключение пространства кучи Java. Поскольку я делаю снимок экрана и сохраняю его как файл, мне больше не нужны предыдущие объекты 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();
}