2009-08-12 37 views
2

我有一个移动应用程序,随着时间的推移正在减速。我的预感(部分由this article提供)是因为内存碎片导致应用程序放慢,但我不确定。这里的应用程序的内存使用的漂亮曲线随着时间的推移:碎片内存是什么样的?

fraggle rock http://kupio.com/image-dump/fragmented.png

图上的4个峰上的应用程序完全相同的任务的4个处决。我开始了任务,它分配了一堆内存,它坐了一下(顶部的扁平线),然后我停止了任务。此时它调用System.gc();内存得到清理。

可以看出,完全相同任务的4次运行中的每一次都需要较长时间才能执行。图中的低点都返回到同一级别,所以在任务运行之间似乎没有任何内存泄漏。

我想知道的是,内存碎片是一种可行的解释,还是应该先查看别处,记住我已经做了很多工作?图上的低点相对较低,所以我的假设是,在这种状态下,内存不会很分散,因为不会有很多小内存孔导致问题。

我不知道j2me内存分配器是如何工作的,所以我真的不知道。任何人都可以建议吗?有没有其他人有这个问题,并认识到应用程序的内存配置文件?

+0

正常的Java虚拟机压缩其堆作为其垃圾收集职责的一部分(消除任何碎片) - 虽然不确定J2ME ...... – bdonlan 2009-08-12 15:56:29

回答

1

如果你有时间一点点,你可以通过重复使用的内存使用内存池技术,测试你的理论:任务使用的每个运行通过将它们从池中取出并在发布时返回它们来实现'相同'的内存块。

如果在进行此调查后仍然看到性能下降,则不是内存碎片引起的问题。让我们都知道您的结果,我们可以帮助进一步排查。

0

内存碎片会占据它......不清楚的是应用程序使用内存是否导致分页?这也会让事情变得缓慢......并可能导致相同的问题。

0

这个问题真的是内存碎片,你可以做的事情不多。

但是,在绝望中放弃之前,尝试使用执行分析器运行您的应用程序,以查看它是否花费了大量时间在意外的地方执行。速度减慢可能是由于算法中存在问题,而与内存碎片无关。正如人们已经说过的那样,J2ME垃圾收集器不应该遭受碎片问题。

0

考虑查看垃圾收集统计信息。如果你的理论持有,你应该在最后一轮比第一轮更多。另一个想法可能是别的东西吃掉你的记忆,所以你的应用程序少了。

换句话说,探查时间:)

0

你在使用什么操作系统?我有一些Windows CE5(或Windows Mobile)设备的使用经验。 CE5的操作系统级存储器体系结构非常糟糕,很快就会出现内存密集型应用程序的故障。您的图形没有任何比例,但每个进程只能在CE5上获得32MB的地址空间。虚拟机和共享库也将获得它们的公平份额,留给你的只剩下很少。 解决此问题的唯一方法是重新使用您分配的内存,而不是将其返回给收集器并稍后重新分配。当然,这是比通常想要在Java中执行的更低级别的编程,但在此平台上,您可能会遇到困难。