【问题标题】:java 'Robot' class memory leakjava 'Robot' 类内存泄漏
【发布时间】:2021-02-25 10:56:17
【问题描述】:

我正在制作共享屏幕程序。(客户端)

很遗憾,我发现发生了内存泄漏。

为了检查内存泄漏,我将其简化为:

import java.awt.*;
import java.awt.image.BufferedImage;

public class Sharescreen {
    public Sharescreen() {
        try {
            Robot robot = new Robot();
            Rectangle winSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

            while (true) {
                BufferedImage image = robot.createScreenCapture(winSize);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] argv) {
        new Sharescreen();
    }
}

运行:

java -Xms50m -Xmx100m -jar "共享screen.jar"

但是!!运行程序10分钟后,

内存使用:

“机器人”课一定有问题!!!

我该如何解决???

java(jdk) 版本:openjdk 11.0

【问题讨论】:

  • Robot 类似乎没有问题。以更好的方式实现 while 循环。
  • 如果是,我该如何实现while循环?
  • 如果Robot类没有问题,为什么这段代码有内存泄漏?
  • 删除循环并检查。

标签: java memory-leaks openjdk-11 java-memory-leaks


【解决方案1】:

在我看来,问题在于您的 while 循环而不是 Robot。您的代码一直在使用 CPU。在 while 循环中添加 Thread.yield() 将使您的线程能够休眠足够长的时间以进行垃圾收集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2015-08-14
    • 2012-08-11
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多