2

我目前正在开发一个应用程序,它需要大约每 20 毫秒快速执行一次(是的,我知道,一开始就不应该采用 Java)。我做了很多优化代码的工作,所以它不会太计算贪婪。但是,正如我所见,我可能没有在 GUI 和内存优化方面付出足够的努力。我的应用程序可以以我想要的速度运行,但在 1-2 分钟后它急剧变慢,表明存在内存问题。

我确实在 NetBeans 下运行了探查器,发现大部分内存都被javax.swing.text.GapContent$MarkData

在谷歌上搜索,我发现几乎没有什么可以帮助我解决这个问题的。那么有没有人可以帮助我?我的第一个猜测是垃圾收集器运行的时间不够长,无法擦除未使用的对象……但我没有比这更多的线索了。

在此处输入图像描述

4

3 回答 3

3

您有权使用剖析;现在用于Profile > Profile Project > CPU查找和定位热点。

减速是由于每次迭代时关闭并打开与数据库的连接的函数。

考虑使用SwingWorker在后台查询数据库并process()事件调度线程上查询结果,如相关示例所示。

于 2013-05-24T01:07:20.010 回答
2

你所谓的“内存积累”只有 600Kb。如果这 600Kb 有问题,我会质疑您对 Java 和 Swing 的选择。

我有一个应用程序,有时会生成数百兆字节的日志消息。我猜你的 GUI 应用程序有点相似。该应用程序可能有一个显示日志的 JTextPane。当应用程序运行时,它会将消息添加到 JTextPane。
JTextPane 使用的 Document 实现是一个PlainDocument
即使您可能总是只在顶部或底部插入新的日志消息,PlainDocument 实现是通用的。它通过在底层文本流中放置一个间隙然后将更改放入间隙中来支持在文档中的任何位置进行修改。当应用程序将新消息插入到文档中时,它会产生很多间隙。
要显示的实际文本必须存在于某处。可能有更好的方法来实现一个巨大的文本窗格,但默认的 JTextPane 在探查器看来就像内存泄漏。如果您有 600kb 的日志消息,它会在某处占用至少 600kb 的内存。

于 2013-05-23T16:30:59.657 回答
1

您应该知道 Java 控制台使用PlainDocumentwithGapContent$MarkData并且只是打开控制台并在其中打开大量数据会导致出现这种“内存泄漏”。清除控制台以查看MarkData回落到可接受水平的数量。

于 2015-02-23T15:16:44.007 回答