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

java程序GapContent$MarkData中的内存构建,java,swing,memory,Java,Swing,Memory,我目前正在开发一个应用程序,需要非常快地执行大约每20毫秒一次(是的,我知道,一开始不应该使用Java)。我花了很多时间优化代码,这样就不会太贪心计算了。然而,正如我所看到的,我可能没有在GUI和内存优化方面投入足够的精力。我的应用程序可以以我想要的速度运行,但在1-2分钟后,它会急剧减速,这表明内存有问题 我确实在NetBeans下运行了探查器,发现大部分内存都被javax.swing.text.GapContent$MarkData 在谷歌上搜索,我发现几乎没有什么可以理解的东西能帮我解决这

我目前正在开发一个应用程序,需要非常快地执行大约每20毫秒一次(是的,我知道,一开始不应该使用Java)。我花了很多时间优化代码,这样就不会太贪心计算了。然而,正如我所看到的,我可能没有在GUI和内存优化方面投入足够的精力。我的应用程序可以以我想要的速度运行,但在1-2分钟后,它会急剧减速,这表明内存有问题

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

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

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

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

您的使用是正确的;现在使用
Profile>Profile Project>CPU
查找并定位热点

减速是由于一个函数在每次迭代中关闭并打开了与数据库的连接


请考虑使用在后台查询数据库,并在上查询
process()
结果,如本相关文档所示。

您应该知道,Java控制台使用带有
GapContent$MarkData
PlainDocument
,只要打开控制台,其中包含大量数据,就会出现此“内存泄漏”。清除控制台以查看
MarkData
的数量下降到可接受的水平。

为了获得一些帮助,您必须添加一些代码。嗯,有数千行文字代码。我想知道首先从哪里开始。Swing因所有这些内存累积而臭名昭著(我不会称之为内存泄漏)。最好重用Swing元素,而不是每次都新实例化它们;现在使用
Profile>Profile Project>CPU
查找并定位热点。@trashgod Darn,真不敢相信,速度放缓是由于每次迭代都关闭并打开了与数据库的连接(通过Wi-Fi连接)。很高兴现在有这样的工具。。。非常肯定,如果不是这样的话,我永远也不会发现问题。+1谢谢你给我指出了这一点(我被我的确定性蒙蔽了双眼)。也许我的应用程序性能的下降是由于其他原因。我将尝试让应用程序在没有GUI的情况下运行,以查看问题是否仍然存在,并查看可能导致此问题的潜在组件。+1提供两个很好的建议。在后台点击数据库是正确的,会让应用程序感觉更快,但实际上不会提高吞吐量。发布/处理也让它感觉更快,而且它确实允许一些并发性:一个线程可以对一些结果执行ui工作,而其余的结果正在被发现/生成。但是最大的改进将来自于解决潜在的问题——写批处理操作,这样在每次迭代时db连接就不会打开和关闭。+1实际上与问题无关,因为问题最终不是内存泄漏,而是有趣的信息。