内存在java程序GapContent $ MarkData中构建

时间:2013-05-22 05:25:31

标签: java swing memory

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

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

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

enter image description here

3 个答案:

答案 0 :(得分:3)

你是正确的profiling;现在使用Profile > Profile Project > CPU来查找和定位热点。

  

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

考虑使用SwingWorker在后台查询数据库,在event dispatch thread上使用process()结果,如相关的example所示。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您应该知道Java控制台使用带有PlainDocument的{​​{1}}并且只是打开控制台并且其中包含大量数据将导致此内存泄漏"出现。清除控制台以查看GapContent$MarkData的数量是否回落到可接受的水平。