JavaFX graphicsContext.drawimage()outofmemory错误

JavaFX graphicsContext.drawimage()outofmemory错误,java,javafx,Java,Javafx,这将是我在这里的第一篇文章,欢迎大家提出建议 内存不断增长的问题在于这段代码 private void drawChart(Canvas canvas) { GraphicsContext gc = canvas.getGraphicsContext2D(); Img i = getRecentImage(); // it contains byte[] source (png format). Img is my own class Image i = new Imag

这将是我在这里的第一篇文章,欢迎大家提出建议

内存不断增长的问题在于这段代码

private void drawChart(Canvas canvas) {
    GraphicsContext gc = canvas.getGraphicsContext2D();
    Img i = getRecentImage(); // it contains byte[] source (png format). Img is my own class
    Image i = new Image(new ByteArrayInputStream(i.getImageBytes()););
    gc.drawImage(i, 0, 0);
}
现在发生了什么。过了一段时间,在加载了数百个这样的图像(每个图像都有100KB未压缩)后,程序崩溃,出现outofmemory错误

当我加上

gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
就在之前

gc.drawImage(i, 0, 0);
一切正常


这段代码的问题是,我不明白为什么清除区域(使其为空)不会导致内存泄漏。drawImage()方法是否保留对我的对象(字节[]数组)的引用,直到gc.clearRect()或..清除它们?我以为我只是复制粘贴字节[]缓冲区,所以我一直在同一个gc内存上操作。

画布是否连接到场景图形并在屏幕上可见?@mipa是的,它一直在场景中绘制。我通过平台推送数据(drawChart())。runLater(任务)根据文档使用画布缓冲区。根据源代码
drawImage()
将图像和一些参数放入该缓冲区。然而,不清楚为什么缓冲区不会自动刷新。也许您填充它的速度比渲染到画布的速度快?它每2-5秒重新绘制一次。看起来它保留了基于x,y位置的引用,但它不应该这样做。有点奇怪。画布附在场景图上并且在屏幕上可见吗?@mipa是的,它一直在现场绘制。我通过平台推送数据(drawChart())。runLater(任务)根据文档使用画布缓冲区。根据源代码
drawImage()
将图像和一些参数放入该缓冲区。然而,不清楚为什么缓冲区不会自动刷新。也许您填充它的速度比渲染到画布的速度快?它每2-5秒重新绘制一次。看起来它保留了基于x,y位置的引用,但它不应该这样做。有点奇怪。