绘制图像时Javafx的内存使用量增加

Posted

技术标签:

【中文标题】绘制图像时Javafx的内存使用量增加【英文标题】:Javafx growing memory usage when drawing image 【发布时间】: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 ? 【参考方案1】:

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

【讨论】:

我的代码似乎也受到了这个错误的影响。我只是在绘制一个星域并滚动它。所以每秒大约绘制 10-20 个椭圆。在 Linux 上,这会在大约一分钟内将内存增加到 16GB 以上。在 Windows 上,这运行得非常好。设置-Dprism.order=sw 为我解决了这个问题。谢谢。 (我越来越偏执了^^)

以上是关于绘制图像时Javafx的内存使用量增加的主要内容,如果未能解决你的问题,请参考以下文章

隐藏阶段时的JavaFX 8内存泄漏

第一次更改图像时 UIImageView 内存增加

OpenGL纹理内存布局和查找速度

第一次更改图像时,UIImageView内存会增加

为啥在屏幕上绘制图像之前不会出现内存不足的问题?

有没有办法强制 JavaFX 释放视频内存?