Java Used Heap RAM 使用高峰,我该如何避免?

标签 java memory-management ram visualvm jvisualvm

首先,我不能真正显示代码,对不起,这些软件属于我工作的公司,而不是我。我会尽力解释我的问题。

我正在开发一个基于 JavaFX 的小应用程序,它在 LineCharts 中显示值,每 800ms-1000ms(0.8-1 秒)刷新一次,并在每次刷新时调用 System.gc()(大约每隔一次0.8-1 秒)。

我每 10-20 秒就有一次 RAM 使用高峰:

enter image description here 在这个具体的例子中,这看起来不像是一个问题,但在某些情况下它会上升到 700-750 MB(使堆大小上升到 1.2-1.3 GB,并且需要很长时间才能将其释放回操作系统)。

我知道(并且目前正在使用,但没有注意到任何巨大的改进)Heap Tuning Paremeters , 但我认为这些不能解决这里的问题,它们在特定点上有所帮助,并略微减少内存消耗,但不能解决问题。

关于如何设计我的代码不具有这些 RAM 峰值的任何想法?我没有使用内存并每 10-20 秒释放一次内存的进程,所以我假设还有其他分配和释放大量 RAM 的东西(也许是 JavaFX?),JVisualVM 只说 int[]、byte[] 和char[],我什至没有在我的代码中使用 Integer 值(我在此软件中使用 Double 值)。

谢谢大家

最佳答案

抱歉,这里唯一合理的答案是:您必须进行分析 才能了解这些峰的来源。您必须确定此问题的根本原因;这不是我们可以帮助的什么

此程序在您的设置中运行,使用您的数据,并显示需要随时间分析的行为。

我的猜测是您的程序正在创建大量对象,这些对象随后会很快被丢弃(我猜您在那里调用 System.gc() 是有原因的)。你猜怎么着:以高速率制造垃圾是个坏主意。因为它让你的 GC 不断旋转;它(显然?!)会导致高内存负载。

因此,如前所述:您必须确定根本原因并加以解决。从这个意义上讲:您必须研究您正在使用的工具。分析的替代方法可能是让 GC 记录其 Activity ;并分析该输出。参见 here了解有关这方面的一些信息。

关于Java Used Heap RAM 使用高峰,我该如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39446698/

相关文章:

ios - Malloc 错误 "can' t 分配区域“失败,错误代码为 12。知道如何解决这个问题吗?

Java Ram 使用不一致

python - 在 Python 中 append 到 JSON(由于 RAM 限制,最佳)

java - 我无法将数据写入 Firebase Firestore

java - Logback 不适用于谨慎模式是正确的

c# - 委托(delegate)分配是否在 C# 中创建新副本?

c - 如果同一个共享库工作正常,为什么静态库会导致对齐问题?

java - 如何在 hibernate 中检索数据库表的值?

java - 在 JUnit 4 中使用不同的 @BeforeClass 设置多次运行测试用例

SQL 查询和 RAM 问题