标签:java memory-leaks javafx javafx-8 fade
经过几个小时的尝试追踪我的应用程序中的内存错误,我已经设法在一个简单的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的剩余部分可用作本机内存.
标签:java,memory-leaks,javafx,javafx-8,fade 来源: https://codeday.me/bug/20190609/1207218.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。