奇怪的JavaFX8 OutOfMemoryError – FadeTransition
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了奇怪的JavaFX8 OutOfMemoryError – FadeTransition,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2944字,纯文字阅读大概需要5分钟。
内容图文
![奇怪的JavaFX8 OutOfMemoryError – FadeTransition](/upload/InfoBanner/zyjiaocheng/808/a2601c1e92d547e485fad2cb1f1e2e43.jpg)
经过几个小时的尝试追踪我的应用程序中的内存错误,我已经设法在一个简单的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运行时,这根本没有问题.但是,当我给VM大大增加内存(例如-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)
我尝试过的多个探查器显示堆几乎占用了任何已分配的空间 – 但任务管理器中的进程视图显示它在几秒钟内通过所有可用内存进行射击.
然而奇怪的事情并没有结束 – 它似乎只有一些宽度和高度值(例如1921的宽度意味着应用程序执行正常,没有错误).
这似乎只发生在一个透明的阶段.如果没有在第一行的舞台上设置透明样式,一切看起来都很好(无论如何我都尝试了所有配置.)同样,它只发生在Java 8上(我使用的是8u20) – Java 7都可以. / JFX 2.x.我正在运行Windows 7×64.
任何人都可以重现这个问题,任何人都可以对任何可能发生的事情有所了解吗?!这是迄今为止我遇到的最奇怪的事情……
更新:我已经设法在一台单独的Windows 8机器上重现这一点,但是另一台Windows 7机箱(和一台Mac)似乎都很好.我不确定究竟是什么JFX代码路径,但不幸的是它似乎完全依赖于机器.
解决方法:
这只回答了你的部分问题,但是这就是为什么增加你的堆将导致OutOfMemeoryError:
从堆栈跟踪中可以看出,JavaFX正在使用DirectByteBuffer进行处理 – 因此数据不会存储在堆中,而是存储在本机内存中.通过增加(固定)堆大小,可以减少操作系统可以作为本机内存提供的可用内存量.
例如.在使用32位Java-VM的Windows上,可寻址内存范围为4GB,为操作系统保留2GB,为java应用程序留出2GB.使用-Xms1000m -Xmx1000m,另一个GB保留用于堆,为VM代码,堆栈,非堆内存(如PermGen等)留下1GB,并且最终GB的剩余部分可用作本机内存.
内容总结
以上是互联网集市为您收集整理的奇怪的JavaFX8 OutOfMemoryError – FadeTransition全部内容,希望文章能够帮你解决奇怪的JavaFX8 OutOfMemoryError – FadeTransition所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。