【发布时间】:2014-12-02 13:45:12
【问题描述】:
在我的应用程序中尝试追踪内存错误数小时后,我设法在一个简单的 JFX 程序中将其减少为一些非常奇怪的行为:
举个简单的例子,将一个矩形逐渐淡化到透明的画布上:
public class Test extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.initStyle(StageStyle.TRANSPARENT);
int width = 1920;
int height = 1080;
Rectangle rect = new Rectangle(width, height);
rect.setFill(Color.SALMON);
rect.setOpacity(0);
StackPane scenePane = new StackPane();
scenePane.getChildren().add(rect);
primaryStage.setScene(new Scene(scenePane));
primaryStage.setWidth(width);
primaryStage.setHeight(height);
primaryStage.show();
FadeTransition ft = new FadeTransition(Duration.millis(10000), rect);
ft.setToValue(1);
ft.play();
}
public static void main(String[] args) {
launch(args);
}
}
当使用 VM args -Xms100m -Xmx100m 运行时,这完全没有问题。但是,当我为虚拟机提供大量更多内存(例如-Xms1000m -Xmx1000m)时,它很快就会崩溃:
java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:127)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at com.sun.prism.impl.BufferUtil.newByteBuffer(BufferUtil.java:90)
at com.sun.prism.impl.BufferUtil.newIntBuffer(BufferUtil.java:121)
at com.sun.javafx.tk.quantum.UploadingPainter.run(UploadingPainter.java:148)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at com.sun.javafx.tk.RenderJob.run(RenderJob.java:58)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
at java.lang.Thread.run(Thread.java:745)
我尝试过的不止一个分析器显示堆几乎不占用任何分配的空间 - 但任务管理器中的进程视图显示它在几秒钟内通过所有可用内存。
然而,奇怪的事情并没有就此结束——它似乎只在 width 和 height 的某些值(例如 1921 年的 width 意味着应用程序执行良好,看不到错误)。 )
这似乎只发生在透明阶段。如果没有在第一行的舞台上设置透明样式,一切似乎都很好(无论如何我都尝试过所有配置。)同样,它只发生在 Java 8 上(我使用的是 8u20)——Java 7 一切都很好/JFX 2.x。我正在运行 Windows 7x64。
任何人都可以重现此问题,并且任何人都可以阐明到底发生了什么?!这是迄今为止我遇到的最奇怪的事情......
更新:我已经设法在单独的 Windows 8 机器上重现了这个,但是另一个 Windows 7 机器(和 Mac)看起来都很好。不确定我正在使用什么 JFX 代码路径,但不幸的是,它似乎完全依赖于机器。
【问题讨论】:
-
如果您在新的
Thread中调用ft.play();,问题会消失吗? -
@ElliottFrisch 不,只是尝试了相同的结果。
标签: java memory-leaks javafx javafx-8 fade