Java 使用ImageIO.write时内存不足

Java 使用ImageIO.write时内存不足,java,out-of-memory,javax.imageio,Java,Out Of Memory,Javax.imageio,即使BlockingQueue是空的,我也会从我的saveScreenShot线程中清除内存错误 在我的主要部分中,存储图像的变量如下 public static BlockingQueue<ImageSaveData> imageQueue1 = new LinkedBlockingQueue<ImageSaveData>(); public static BlockingQueue<ImageSaveData> imageQueue2 = new

即使BlockingQueue是空的,我也会从我的saveScreenShot线程中清除内存错误

在我的主要部分中,存储图像的变量如下

public static BlockingQueue<ImageSaveData> imageQueue1 = new LinkedBlockingQueue<ImageSaveData>();
    public static BlockingQueue<ImageSaveData> imageQueue2 = new LinkedBlockingQueue<ImageSaveData>();
    public static BlockingQueue<ImageSaveData> imageQueue3 = new LinkedBlockingQueue<ImageSaveData>();
    public static BlockingQueue<ImageSaveData> imageQueue4 = new LinkedBlockingQueue<ImageSaveData>();
这是我的线程,它截图并保存到imageQueueX

    // long start = System.currentTimeMillis();
    synchronized (runner)
    {
        int imageCount = 0;
        int maxCount = 0;
        boolean hasMessage = false;
        String[] countFormat =
        {
                "00000000", "0000000", "000000", "00000", "0000", "000", "00", "0"
        };
        // 10
        while (true)
        {
            if (maxCount++ < 1000000010)
            {
                try
                {
                    BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                    String imageOutNumb = "";
                    if (imageCount < 10) imageOutNumb = countFormat[0] + imageCount++;
                    else if (imageCount < 100) imageOutNumb = countFormat[1] + imageCount++;
                    else if (imageCount < 1000) imageOutNumb = countFormat[2] + imageCount++;
                    else if (imageCount < 10000) imageOutNumb = countFormat[3] + imageCount++;
                    else if (imageCount < 100000) imageOutNumb = countFormat[4] + imageCount++;
                    else if (imageCount < 1000000) imageOutNumb = countFormat[5] + imageCount++;
                    else if (imageCount < 10000000) imageOutNumb = countFormat[6] + imageCount++;
                    else if (imageCount < 100000000) imageOutNumb = countFormat[7] + imageCount++;
                    else imageOutNumb = "" + imageCount++;

                    ImageSaveData imageSaveData = new ImageSaveData(imageOutNumb, image);

                    while (true)
                    {
                        if (Main.imageQueue1.offer(imageSaveData, 1, TimeUnit.NANOSECONDS)) break;
                        if (Main.imageQueue2.offer(imageSaveData, 1, TimeUnit.NANOSECONDS)) break;
                        if (Main.imageQueue3.offer(imageSaveData, 1, TimeUnit.NANOSECONDS)) break;
                        if (Main.imageQueue4.offer(imageSaveData, 1, TimeUnit.NANOSECONDS)) break;
                    }
                }
                catch (HeadlessException | AWTException e)
                {
                    e.printStackTrace();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                catch(OutOfMemoryError e)
                {
                    try
                    {
                        runner.sleep(1);
                    }
                    catch (InterruptedException e1)
                    {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
                try
                {
                    runner.sleep(34);
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            else
            {
                if (hasMessage)
                {
                    try
                    {
                        System.out.println(Main.imageQueue1.isEmpty());
                        System.out.println(Main.imageQueue2.isEmpty());
                        System.out.println(Main.imageQueue3.isEmpty());
                        System.out.println(Main.imageQueue4.isEmpty());
                    }
                    catch (Exception e)
                    {

                    }
                }
                else
                {
                    System.out.println("We Have Finished saving images to memory");
                    hasMessage = true;
                }
            }
        }
    }
错误

第48行是

BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

队列的容量是多少?当前堆的大小是多少

根据您的分辨率(例如1024x768x32分辨率:1024x768x4bytes/pixel=3.14MB),每个屏幕截图的大小大约为3-10MB,并且您可能能够以比写入磁盘更快的速度获取它们

根据堆大小和队列容量的不同,可能根本不需要很长时间就可以完成可用堆

另外,我不确定(您可能在其他地方有其他代码),但看起来您可能只从消费者线程中的一个队列进行轮询:

ImageSaveData imageData1 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData2 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData3 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData4 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);

编辑:哇,我不知道这条线已经有两年了

队列的容量是多少,当前堆的大小是多少

根据您的分辨率(例如1024x768x32分辨率:1024x768x4bytes/pixel=3.14MB),每个屏幕截图的大小大约为3-10MB,并且您可能能够以比写入磁盘更快的速度获取它们

根据堆大小和队列容量的不同,可能根本不需要很长时间就可以完成可用堆

另外,我不确定(您可能在其他地方有其他代码),但看起来您可能只从消费者线程中的一个队列进行轮询:

ImageSaveData imageData1 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData2 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData3 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData4 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);

编辑:哇,我不知道这条线已经有两年了

请发布完整的错误消息和完整的回溯。好的,我正在等待它error@PM77-1在OPIs外部
while的底部添加了一个错误(true)
循环有意无止境?@PM77-1是其有意无止境请发布完整的错误消息,并提供完整的回溯。好的,我正在等待error@PM77-1在OPIs的底部添加了一个错误,即您的外部
while(true)
循环有意无止境?@PM77-1是,有意无止境
BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageSaveData imageData1 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData2 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData3 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);
ImageSaveData imageData4 = Main.imageQueue1.poll(1, TimeUnit.NANOSECONDS);