【问题标题】:Javafx growing memory usage when drawing image绘制图像时Javafx的内存使用量增加
【发布时间】:2016-12-30 11:41:54
【问题描述】:

我正在用 JavaFX 创建一个非常简单的围棋棋盘游戏。我偶然发现我的应用程序中的内存使用量增加了,在减少了所有不必要的内容之后,似乎即使是 minimal 示例也会导致巨大的内存增长超时,大约 50 到 100MB/s

代码如下:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
    Group root = new Group();
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 600, 600));
    Canvas canvas = new Canvas(600, 600);
    Image bg = new Image("resources/images/background2.jpg", 600, 600, false, false);
    root.getChildren().add(canvas);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    new AnimationTimer() {
        @Override
        public void handle(long l) {
            gc.drawImage(bg, 0, 0, 600, 600, 0, 0, 600, 600);
        }
    }.start();
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}
}

当我删除 gc.drawImage 行时不会出现问题,但这显然不是解决方案。

顺便说一句。我正在使用带有 OpenJDK 8 的 Arch Linux 64 位

【问题讨论】:

  • 我不明白的是:您确定要怪 JavaFx 部分吗?你有没有做过任何类型的内存分析来确定你的内存用在了哪里?
  • 你在上面看到的是整个程序。仅此而已,所以我不知道除了 JavaFx 是否还有其他不起作用的东西。
  • 好吧,如果这真的是整个程序,那么您想添加缺少的部分来完成您的课程。 “几乎完成”仍然不是minimal reproducible example
  • 现在我把里面的所有东西都插入了。
  • 你的内存设置是什么? -Xmx ?

标签: java memory javafx memory-leaks


【解决方案1】:

有大量关于 Linux 上 JavaFX 内存泄漏的错误报告。 例如JDK-8156051JDK-8161997。 要验证您是否遇到此错误,请尝试使用-Dprism.order=sw 运行您的程序并查看错误是否仍然存在。

【讨论】:

  • 我的代码似乎也受到了这个错误的影响。我只是在绘制一个星域并滚动它。所以每秒大约绘制 10-20 个椭圆。在 Linux 上,这会在大约一分钟内将内存增加到 16GB 以上。在 Windows 上,这运行得非常好。设置-Dprism.order=sw 为我解决了这个问题。谢谢。 (我越来越偏执了^^)
猜你喜欢
  • 2019-02-20
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多