java - 线程会降低 PC 速度并导致 java.lang.OutOfMemoryError

标签 java multithreading

我正在做的是制作一个程序,不断地截取用户桌面的屏幕截图并根据用户的需要保存它们。我最初调用了在 while 方法中捕获的方法,但这太慢了,我需要尽快拍摄尽可能多的图像。我决定做的是使用线程。

当程序运行时,我的电脑速度变慢(即鼠标闪烁、移动缓慢等),当我停止程序时,出现以下错误。

Exception in thread "Thread-294" java.lang.OutOfMemoryError: Java heap space
at sun.awt.windows.WRobotPeer.getRGBPixels(Unknown Source)
at java.awt.Robot.createScreenCapture(Unknown Source)
at maple.Record.run(Record.java:29)

这是产生错误的行。

img = r.createScreenCapture(new Rectangle (0, 0, width, height));

这是我包含线程的类。

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.media.MediaLocator;

public class Record implements Runnable {

    Robot r;
    static int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    static int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
    BufferedImage img;
    public static boolean stop = false;

    public void run() {

        try {

            r = new Robot();
            img = r.createScreenCapture(new Rectangle (0, 0, width, height));
            ImageIO.write(img, "png", new File(JavCapture.tmpLocation + "\\tmp\\" + System.currentTimeMillis() + ".png"));

        } catch (IOException | AWTException e) { e.printStackTrace(); }

    }

}

当我调用已编辑以处理 .png 文件的 JpegImagesToMovies 时,会产生错误。

请查看this链接以获取更多信息。

我该如何解决这个问题,以及如何让线程使用更少的内存,这样就不会减慢电脑的速度。

这里是main方法中的调用。

do {    
    (new Thread(new Record())).start();
} while (!Record.stop);

最佳答案

从表面上看,您正在为每个屏幕截图创建一个单独的线程,这会很快耗尽内存。相反,您应该有一个循环、 hibernate 并时不时截取屏幕截图的线程。

    public class ScreenshotTaker implements Runnable {



        private volatile boolean done = false;



        public void run( ) {

            while (!done) {
            ... take screenshot...

            ...sleep ...
            }

        }

        public void setDone( ) {

            done = true;

        }

    }

关于java - 线程会降低 PC 速度并导致 java.lang.OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302194/

相关文章:

c - 难以理解 CPU 调度概念

java - 如何使用具有单表模型的 POJO 创建 JTable

python - 在未来回调中调用 future 结果时 ThreadPoolExecutor 挂起

python - 当我将 python 线程设置为守护进程时有什么区别

java - 使用 Wea​​kHashMap 减少内存使用

python - 多线程运行速度较慢

linux - 如何在多线程环境中实现垃圾回收?

java - j2me错误: class myClass is public should be declared in a file named myClass. java

java - 如何配置 apache httpclient 4.5+ SSLContext 以使用带有自签名证书的双向 TLS 身份验证?

java - 使用 Java 进行语言排序(德语)