BREW常見檔案解答(FAQ 6)-記憶體管理 (轉)

worldblog發表於2007-12-14
BREW常見檔案解答(FAQ 6)-記憶體管理 (轉)[@more@]

5. 管理

FAQ 5a:

問:發生"Undef Inst Exception?"錯誤時,我如何恢復?
答:"Undef Inst Exception?"表示"不確定的指令異常",意思是指指標跳轉到一段包含不確定的指令的程式碼段上。造成這種情況的原因一般是:記憶體丟失、堆疊出界、應用程式程式碼和BREW圖形的版本不相容。

真機的記憶體容量比模擬器上有更多的限制。因此,在真機上記憶體和堆疊出界會經常出現。你應當仔細檢查相關的記憶體區,特別是陣列變數和堆分配的最大值。

拔出電池一會,就會清除電話資料。

FAQ 5b:

問:什麼是"Re-entrant Data Abort?"
答:"Re-entrant Data Abort"錯誤經常由堆疊超界造成。應用程式允許在真機上,這時的堆疊大小很小,你可能會看到比在模擬器中執行時更多的堆疊超界現象。

另外如果應用程式程式碼和BREW圖形版本不相容,那麼也會造成這種錯誤。

FAQ 5c:

問:"Pref Abort Exception?"是什麼意思?
答:"Pref Abort Exception?"通常表示操作廢棄了重要記憶體空間。造成這個錯誤的原因通常有兩種:資料破壞、堆疊超界。

FAQ 5d:

問:"SWI Exception?"是什麼意思?
答:"SWI Exception?"通常是指堆管理不善。造成的原因通常是指:超越分配記憶體堆寫入資料,對此釋放分配記憶體堆、向空指標空間中寫入資料。

除了上述原因外,堆疊超界也會造成這種異常。建議使用大記憶體區,而不要使用堆疊中的自動變數。

FAQ 5e:

問:當應用程式退出時,模擬器顯示一個空白螢幕?
答:在模擬器上執行應用程式退出時,顯示空白螢幕,螢幕上方顯示這個應用程式的名稱,而不是通常顯示的主介面。

這種現象是在程式退出時沒有完全釋放記憶體堆造成的。使用MALLOC或者IHEAP_Malloc()分配的記憶體堆必須要用FREE和IHEAP_Free()釋放掉。而且你建立的BREW類例項,也要相應的release釋放。

FAQ 5f:

問:BREW的記憶體結構是怎樣工作的?
答:BREW裝置通常有Flash RAM器和Heap RAM儲存器。可把Flash RAM看作裝置。這個儲存了程式,但卻不能從這裡執行。而Heap RAM可看作記憶體。假定你有一個大小為35K的應用程式,那麼需要從Flash RAM中空出35K來儲存這個程式。執行應用程式時,需要把35K的程式裝入Heap RAM中。當這個程式結束執行被釋放時,佔用Heap RAM的空間就會被釋放掉。程式依然佔用FLASH RAM,直到這個程式從硬碟驅動裝置中刪除。

FAQ 5g:

問:應用程式的大小限制是多少?
答:BREW應用程式的大小受到可獲得的空閒系統空間的限制,以及可獲得的記憶體空間的限制。

執行的應用程式裝入記憶體,剩下的記憶體可被用於記憶體分配,裝載資源,建立等。可用記憶體的多少與電話型號有關,並且是可的。比如QCP-3035電話,可用的記憶體有90K,30K用於BREW任務分配,剩下60K才被用於應用程式。每一種電話的可用記憶體都可被全部使用。

另外的限制因素是記憶體碎片。如果最大的可用記憶體塊小於應用程式的大小,那麼應用程式就不能被正確裝載。使用IHEAP_CheckAvail()來確定是否有足夠的記憶體塊可用。IHEAP_GetMemStats()用來確定已被使用的記憶體數量。如果你的應用程式必裝置記憶體空間大,那麼就需要把這個程式分成多個程式。記憶體分配提供更多的資訊來避免記憶體碎片。

注意:
為了測試低記憶體情況,可在裝置配置檔案中減少堆大小數量。
BREW系統資訊螢幕報告的是可用Flash空間,而不是可用記憶體數量。

FAQ 5h:

問:為什麼應用程式不能直接執行在Flash RAM空間中呢?
答:BREW裝入應用程式到Heap RAM中,是因為儲存在嵌入式檔案系統(EFS)中的檔案是不相鄰的。

FAQ 5i:

問:BREW SDK中的MALLOC()和IHEAP_Malloc()函式有何不同?
答:MALLOC()和IHEAP_Malloc()是相同的,而且FREE和IHEAP_Free()也是相同的。早期版本的BREW SDK的malloc是IHEAP介面的一部分,為了方便使用,後來才加入助手函式中的。為了向後相容,兩者都可使用,但推薦使用MALLOC和FREE,不推薦使用IHEAP_Malloc()和IHEAP_Free()。

應用程式如果要建立IHEAP介面,一般是常使用得到當前記憶體使用情況(IHEAP_GetMemStats()),和檢查可被分配的記憶體塊大小(IHEAP_CheckAvail())。

FAQ 5j:

問:我如何測試模擬器上的應用程式,來判斷它是否執行在低記憶體情況?
答:這種想法可透過減少裝置配置檔案(.qsc檔案)的堆大小來實現。方法是減少到和.mod檔案大小差不多。這樣任何執行應用程式時分配記憶體都會失敗,這樣你就能測試出你的應用程式能夠處理這種失敗情況。

由於.mod檔案要比.dll檔案小得多,模擬器配置的大小接近.mod檔案,大約是.dll檔案的10%。

要完全執行這種測試,應當建立獨立目錄,這個目錄僅包含MIF檔案用於測試,然後設定模擬器指向這個新目錄(File->Change MIF Dir)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993238/,如需轉載,請註明出處,否則將追究法律責任。

相關文章