JavaFX 8隐藏阶段时内存泄漏

时间:2014-06-24 15:41:49

标签: java memory-leaks garbage-collection javafx javafx-8

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

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

在VisualVM中,Old Gen空间不断上升,一旦达到最大值,应用程序将无法响应,CPU峰值将达到80%。

我注意到,如果我在应用程序上stage.show()双击托盘图标等,GC会将所有内容恢复正常。但是,如果长时间离开,它将无法使GC老化。

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

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

造成这种情况的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:1)

我从来没有找到并回答这个问题。相反,我会在隐藏上隐藏节点并在视图上恢复它。对于密集的动态节点/多个节点,我创建了一个哈希映射来将它们存储在内存中。

在javafx8中,这有点习惯于处理所有图形并重新分配到hide&amp;从哈希地图查看。在现代桌面上,额外的内存和CPU使用率可以忽略不计。使用这种方法,我在win8 / 10上隐藏了0个cpu使用应用程序和低内存应用程序(~100m)。

答案 1 :(得分:-1)

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 - &gt;&gt;什么垃圾收集。

另外,还有Concurrency API http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

使用Executor Service和Thread Pooling。

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

System.gc() // garbage collector

在Intervals无论其自动调用

您可以使用Runtime类为项目计划Load Balancers https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

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中,场景的每个组件都是紧密绑定到场景的线程,但在实现时,它似乎是松散绑定的。< / p>

如果需要长时间运行,最好处理Native端(JNI)中的一些处理器密集型任务。  此外,CLEAN架构将有益于

https://www.google.co.in/webhp?sourceid=chrome-instant&rlz=1C1CHBF_enIN736IN736&ion=1&espv=2&ie=UTF-8#q=clean+code& *