大家都知道android的上層應用是基於 dalvik virtual machine的。dalvik vm的特點是基於暫存器,相比sun的jvm(基於堆疊,沒有暫存器)來說,理論上完成同樣的功能需要的指令條數少,但是指令集複雜。到了android2.2,dalvik終於實現了jit(just in time)功能,前進了一大步。
近期我們遇到outofmemory的錯誤,通常是堆記憶體溢位。網上有些帖子說可以通過函式設定應用的heap size來解決這個問題,其實是不對的。
vmruntime.getruntime().setminimumheapsize(newsize);
堆(heap)是vm中占用記憶體最多的部分,通常是動態分配的。堆的大小不是一成不變的,通常有乙個分配機制來控制它的大小。比如初始的heap是4m大,當4m的空間被占用超過75%的時候,重新分配堆為8m大;當8m被占用超過75%,分配堆為16m大。倒過來,當16m的堆利用不足30%的時候,縮減它的大小為8m大。重新設定堆的大小,尤其是壓縮,一般會涉及到記憶體的拷貝,所以變更堆的大小對效率有不良影響。
上面只是個例子,不過可以看到三個引數:max heap size, min heap size, heap utilization(堆利用率)。
max heap size,是堆記憶體的上限值,android的預設值是16m(某些機型是24m),對於普通應用這是不能改的。函式setminimumheapsize其實只是改變了堆的下限值,它可以防止過於頻繁的堆記憶體分配,當設定最小堆記憶體大小超過上限值時仍然採用堆的上限值,對於記憶體不足沒什麼作用。
settargetheaputilization(float newtarget) 可以設定記憶體利用率的百分比,當實際的利用率偏離這個百分比的時候,虛擬機會在gc的時候調整堆記憶體大小,讓實際佔用率向個百分比靠攏。
關於Android堆記憶體的設定
關於android堆記憶體的設定 c c code 關於android堆記憶體的設定 已編輯 選項 將帖子標記為未讀 將此主題新增到書籤 訂閱此主題 訂閱此主題的 rss 提要 高亮顯示此貼 列印此貼 通過電子郵件將此主題傳送給好友 舉報此貼 修改時間 08 30 201012 2108 30 20...
關於Android堆記憶體的設定
關於android堆記憶體的設定 c c code 關於android堆記憶體的設定 已編輯 選項 將帖子標記為未讀 將此主題新增到書籤 訂閱此主題 訂閱此主題的 rss 提要 高亮顯示此貼 列印此貼 通過電子郵件將此主題傳送給好友 舉報此貼 修改時間 08 30 201012 2108 30 20...
關於記憶體型別中的堆
之所以想談談這個是因為,最近在上網搜尋的時候無意間發現,有人誤將資料結構中的堆 就是那個 大頂堆 小頂堆 的堆 和記憶體結構中的 堆 弄混了。記憶體型別中的堆其實其實用來指一塊能夠自由申請釋放的記憶體區域,其實是和資料結構中的堆是沒有關係的。記憶體中的堆就是一 堆 東西的 堆 的意思。我猜測會有人弄...