首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX 8隐藏阶段内存泄漏

JavaFX 8隐藏阶段内存泄漏
EN

Stack Overflow用户
提问于 2014-06-24 15:41:48
回答 2查看 2.9K关注 0票数 36

我有一个JavaFX应用程序,当按下X按钮时,它可以最小化为托盘。我一直在通过VisualVM监控应用程序的内存趋势。

奇怪的是,当应用程序打开或最小化到任务栏时,内存总是GCed返回到使用的初始内存。然而,当内存最小化到托盘(stage.hide()systemTray.show())时,内存就会得到GCed,但会有上升的趋势(泄漏)。

在VisualVM中,老Gen空间不断上升,一旦在一段时间后达到最大值,应用程序就会失去响应,CPU峰值达到80%。

我注意到,如果我通过双击托盘图标等方式在应用程序上创建stage.show() ,GC会将所有内容清除回正常的。然而,如果长时间的离开,它将仅仅是不能GC的老一代。

堆转储显示javafx.scene.Scene#7javafx.scene.Node[]#2保留的空间最多。如果舞台不被隐藏,两者都不会出现。在参考文献中,它显示了this[] -> dirtyNodes()

代码语言:javascript
复制
this     - value: javafx.scene.Node[] #2
<- dirtyNodes     - class: javafx.scene.Scene, value: javafx.scene.Node[] #2
 <- value     - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value:  
 javafx.scene.Scene #7

是什么导致了这一切,我如何解决这一问题?

EN

回答 2

Stack Overflow用户

发布于 2017-03-28 07:57:29

我从来没有找到并回答过这个问题。相反,我将使隐藏上的节点为空,并将其还原回视图中。对于密集的动态节点/多个节点,我创建了一个散列映射来将它们存储在内存中。

这已经成为我在javafx8中的一种习惯,在散列图中处理所有图形并重新分配隐藏和视图。在现代桌面上,额外的内存和cpu使用量是可以忽略不计的。使用这种方法,当隐藏在win8 8/10上时,我已经运行了0 cpu使用程序和低内存应用程序(~100 M)。

票数 2
EN

Stack Overflow用户

发布于 2017-03-27 06:07:57

Java具有弱引用这样的特性:https://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html

软参考:https://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html

这些允许您专门针对VM ->>垃圾收集。

此外,还存在并发API http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

它使用Executor服务和线程池。

对于java中的内存限制应用程序,软件应该调用

System.gc() // garbage collector

每隔一段时间不管它的自动调用

可以使用Runtime类为项目https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html调度负载平衡器。

代码语言:javascript
复制
public Process exec(String command)


                throws IOException
//--------------------------------------------------------
    Executes the specified string command in a separate process.

public void gc()

//----------------------------------------------------------
Runs the garbage collector. Calling this method suggests that the Java virtual machine expends effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the virtual machine has made its best effort to recycle all discarded objects
This is a convenience method. An invocation of the form exec(command) behaves in exactly the same way as the invocation exec(command, null, null). 

线程处理一直是内存密集型应用程序的问题,在JavaFX中,场景的每个组件都是紧密绑定到场景的线程,但是在实现时,它似乎是松散绑定的。

如果需要长时间运行,则需要更好地处理本机端(JNI)中的一些处理器密集型任务。此外,一个干净的架构也会有好处。

enIN736IN736&ion=1&espv=2&ie=UTF-8#q=clean+code&*

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24390918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档