Я занимаюсь разработкой программного обеспечения на 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();
}