2013-04-07 237 views
2

我正在使用Galaxy Nexus(i9250)進行開發和測試。我注意到奇怪的事實 - 有時當總堆大小爲64mb並且分配的堆大小在56-60mb左右時,應用程序崩潰。但有時我注意到即使內存高達80MB,應用程序也沒有崩潰。Nexus的最大堆大小?

最初我認爲範圍nexus設備的最大堆大小爲64mb(現在我意識到這是錯誤的)。所以我的問題是設備可以使用的最大堆大小是多少。如果它是基於設備變量的,那麼堆大小取決於什麼因素。我知道這是一個常見的問題。任何人都可以引導我選擇正確的答案。提前致謝!

注:我沒有在我的代碼

+4

對於應用的堆

ActivityManager.getLargeMemoryClass()可用兆字節數你在做什麼,需要那麼多的堆空間? – 2013-04-07 19:40:27

+5

我知道這很挑剔,但是當人們沒有具體說明他們需要具體說明的事情時,我發現它令人難以置信地煩人。有Nexus One,Nexus S,Galaxy Nexus,Nexus 4,Nexus 7和Nexus 10.你告訴我們你正在使用「Nexus」,你可能會告訴我們你正在使用「Android」。我假設這是一個7或10,但cmon的人... – 2013-04-07 19:54:02

+0

http://stackoverflow.com/questions/5350465/android-heap-size-on-different-phones-devices-and-os-版本 – dongshengcn 2013-04-07 20:07:05

回答

0

使用LargeHeapSize = true;目前尚不清楚什麼設備你究竟在說什麼。目前還不清楚你如何計算你的堆內存。

我建議你使用這個link

計算你的堆內存和可用存儲但是,如果你的應用程序使用本機內存,它們是對link沒有限制。

+0

我正在使用nexus i9250(galaxy nexus)。我沒有計算堆大小,而是在談論Eclipse顯示的堆大小(您可以在DDMS中看到它)。 – 2013-04-07 20:11:43

0

我只會使用DDMS值作爲指導來查找內存泄漏和內存分配問題,而不是某些您可以定位的特定數字。任何Android應用程序都將在各種設備上運行,因此,雖然您可能已將應用程序調整爲「Galaxy Nexus」,但您仍希望能夠在較舊的設備上運行並進行適當測試。見 @dongshengcn評論。

除了@minhaz的鏈接我還會讀:Understanding Heap Size

如果您試圖更好地理解Android上的內存管理,那麼您應該閱讀Android Framework Engineer @ hackbod的答案:How to Discover Memory Usage of My Application in Android

1

考慮,您的應用程序崩潰,每次給時間「的OutOfMemoryError」

DVM開始通過分配一個小堆,每個垃圾收集週期之後它會檢查免費堆,並將其與總堆內存並增添了更多如果差異太小,內存不足。所以根據Dalvik VM對操作系統的要求,堆​​可以在運行時增加或減少。

所以,當他們足夠的可用內存在系統中您的應用程序沒有得到墜毀時,內存最多拍攝80MB(64MB假設不是堆大小的硬限制)

是的,有一個硬限制每個設備的堆大小,可以通過使用「LargeHeapSize = true」來增加每個設備的堆大小,但應用程序性能方面的成本可能太高,因爲增加的堆大小與垃圾收集過程所花費的時間成正比(因爲GC現在必須在更大的堆內遍歷更多的對象)。所以這是一個很大的「否,否」,除非你完全知道什麼,爲什麼你要更大的堆大小。

什麼因素堆大小取決於:

  • 堆的大小主要取決於你是 使用,隨着越來越多的分辨率需要較大的圖像/位圖尺寸以適應 設備的分辨率。(更多像素=需要更多的內存納入)

  • 雖然,我沒有通過任何這種書面證明,得到了..按我的理解 堆大小還取決於RAM的大小。因爲,更大的
    RAM大小將允許多任務處理更靈活,並得到的較小
    機會「的OutOfMemoryError」

如果你需要知道的堆內存的確切數額,你可以使用,ActivityManager .getMemoryClass()。此方法返回一個整數,指示較大的堆大小