2009-08-12 111 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中執行的更低級別的編程,但在此平臺上,您可能會遇到困難。