java - 碎片化内存是什么样子的?

标签 java memory memory-management java-me memory-fragmentation

我有一个移动应用程序随着时间的推移速度变慢。我的直觉(部分由 this article 提供)是由于内存碎片导致应用程序变慢,但我不确定。这是应用内存使用随时间变化的漂亮图表:

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

图表上的 4 个峰值是应用程序上完全相同的任务的 4 次执行。我开始任务,它分配了一堆内存,它坐了一会儿(顶部的扁平线)然后我停止了任务。那时它调用 System.gc();并且内存被清理。

可以看出,完全相同的任务的 4 次运行中的每一次都需要更长的时间来执行。图中的低点都返回到同一水平,因此任务运行之间似乎没有任何内存泄漏。

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

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

最佳答案

如果您有一点时间,您可以通过使用内存池技术重新使用内存来测试您的理论:任务的每次运行都使用“相同”的内存块,方法是从池中获取它们并在发布时归还它们。

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

关于java - 碎片化内存是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267031/

相关文章:

java - JFrame 和 JPanel 的背景颜色不同

java - Spring Security 无效登录处理

javascript - 预加载页面,关于它的各种问题

c - 为什么要在堆上而不是栈上分配内存?

java - 合并两个 .m4a 文件或将 .wav 文件转换为 m4a

java - 将文本文件中的数字输入到 ArrayList 中,同时计算每个数字的出现次数

c - 分析 Unix 中 C 语言中每个函数的内存使用情况

ios - 复制时保留计数

c++ - 如何清除为 C++ 中的指针正确指向的数组分配的内存?

cuda,内核内存印记中的动态内存分配?