2012-02-28 57 views
6

我有一個OpenGL Android應用程序,它使用大量內存來設置一個複雜的場景,這顯然會導致大量的堆碎片。即使沒有內存泄漏,也不可能銷燬和創建應用程序,而不會由於碎片導致內存不足。 (碎片肯定是問題,而不是泄漏)Android堆分段策略?

這將導致一個重大的問題,因爲Android有破壞和創造在同一VM /堆這顯然會導致活動崩潰活動的習慣。至於對付這個戰略我已經使用了以下技術:

@Override 
protected void onStop() { 
    super.onStop(); 
    if(isFinishing()) { 
     System.runFinalizersOnExit(true); 
     System.exit(0); 
    } 
} 

這保證了當活動結束它會導致一個完整的虛擬機關閉,因此下一次活動開始它得到一個新的不分段堆。

注:我意識到這不是「Android方式」,但考慮到垃圾收集器是非壓縮的,不可能連續重用堆。

這個技巧實際上一般工作,但是當它在一個非完成模式下被破壞然後重新創建時它不起作用。

有沒有人有關於如何處理堆的降解什麼好的建議?

此外應注意:減少內存消耗是不是真的任何一個選項。這個活動實際上並沒有使用那麼多的內存,但堆(和本機堆)似乎很容易被分割,可能是由於一些大的內存塊

+0

我有同樣的問題,並採用了類似的解決方案。真可怕。 – 2015-10-14 23:02:59

回答

4

碎片幾乎總是由於病態分配模式。大型對象經常被創建和銷燬。結合更小的對象可能會持續(或至少有一個不同的生命週期) - 創建堆中的空洞。

在這種情況下唯一的工作分片預防是:防止特定分配模式。這通常可以通過彙集大型對象來完成。如果成功,應用程序將會以更好的執行速度感謝您的承認。

@edit:但更具體到你的問題:如果應用程序重新啓動後的堆尚未空的,所以還有什麼可保留在堆上?你確認它不是內存泄漏的問題,但這是,它看起來像。既然你使用的是OpenGL,可能會有一些本地包裝存活下來,因爲OpenGL的資源並沒有妥善處置?