当前位置: 首页 > 知识库问答 >
问题:

JavaFX 8隐藏后台时内存泄漏

钱承允
2023-03-14

我有一个JavaFX应用程序,当按下X按钮时,它可以最大限度地减少对托盘的访问。我一直在通过VisualVM监控应用程序的内存趋势。

奇怪的是,当应用程序打开或最小化到任务栏时,内存总是会被重新分配到最初使用的内存。但是,当它最小化到托盘(stage.hide())时,systemTray。show()。

在VisualVM中,旧的Gen空间不断增加,一旦在一段时间后达到最大值,应用程序将无响应,CPU峰值将达到80%。

我注意到,如果我stage。show()在应用程序上双击托盘图标等,GC会将所有内容清除回正常状态。然而,如果长时间放置,它将完全无法恢复旧的一代。

堆转储显示javafx。场景场景#7javafx。场景节点[]#2具有最多的保留空间。如果不隐藏舞台,两者都不会出现。在references下面,它显示了this[]-

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个答案

堵乐
2023-03-14

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-

此外,还有并发APIhttp://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

它使用执行器服务和线程池。

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

System.gc () // 垃圾收集器

每隔一段时间,与它的自动调用无关

可以使用Runtime类为项目调度负载均衡器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中,场景的每个组件都与场景紧密绑定,但在实现时,它似乎是松散绑定的。

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

https://www.google.co.in/webhp?sourceid=chrome-瞬间

段晨
2023-03-14

我从来没有找到答案。相反,我会在隐藏时将节点设为空,然后在查看时将其恢复。对于密集型动态节点/多个节点,我创建了一个哈希映射,将它们存储在内存中。

这已经成为我在javafx8中处理所有图形并在隐藏上重新分配的习惯

 类似资料:
  • 应用Controller目录下文件命名规则,以****adminController.class.php或者Admin****Controller.class.php命名的是后台controller, 在后台菜单导入时会自动识别 以下几个功能是debug开启时才会出现的: 所有菜单 这个是用来管理后台所有菜单的,在这里可以很方便的对那些“未知”的菜单进行编辑 导入新菜单 这个功能就是所有菜单里那个

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是

  • 问题内容: 我一直在追寻内存泄漏(由“ valgrind –leak-check = yes”报告),它似乎来自ALSA。这段代码已经存在于自由世界中一段时间​​了,所以我猜这是我做错的事情。 输出看起来像这样: 并继续一些页面 这是由于我在一个项目中使用ALSA并开始看到这种巨大的泄漏……或者至少是所说泄漏的报告。 所以问题是:是我,ALSA或valgrind在这里遇到问题吗? 问题答案: ht

  • 问题内容: 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏? 问题答案: 看看这篇文章:跟踪python内存泄漏 另外,请注意,垃圾收集模块实际上可以设置调试标志。看一下功能。此外,请查看Gnibbler的这段代码,以确定调用后已创建

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 问题内容: 我使用Informix遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix命名空间,即4.10 Client SDK)。我正在使用ODBC连接到IBM Informix数据库,并且遇到内存泄漏问题。该文档相当稀疏,并且我只能使用当前安装的驱动程序/ SDK。这是我用于数据库上下文的代码: } 我已尝试处置并关闭所有可以的连接,但这似乎无济于事。我是否缺少某些东西