1、先說DDMS中的Heap的使用,經過能夠觀察VM中的Java內存,可是沒法查看經過JNI分配的內存。
直接上圖,廢話少說。。。 java
圖一:將要查看內存使用狀況的項目Update heap shell
圖二:操做項目,經過圖表能夠很直觀查看虛擬機的使用內存
GC_EXTERNAL_ALLOC freed 297K, 49% free 3411K/6663K, external 24870K/26260K, paused 83msfree 3411K/6663K和external 24870K/26260K,分別都是表示 前面Free的內存是VM中java使用的內存,external是指VM中經過JNI中Native的類中的malloc分配出的內存,例如Bitmap和一些Cursor都是這麼分配的。 在Davilk中,給一個程序分配的內存根據機型廠商的不一樣,而不一樣,如今的大部分的是32M了,而在VM內部會把這些內存分紅java使用的內存和 Native使用的內存,它們之間是不能共享的,就是說當你的Native內存用完了,如今Java又有空閒的內存,這時Native會從新像VM申請,而不是直接使用java的。 例如上邊的例子 free 3411K/6663K和external 24870K/26260K 若是這時須要建立一個2M的Bitmap,Native現有內存26260-24870=1390K<2048k,所以他就會向Vm申請內存,雖然java空閒的內存是 6663-3411=3252>2048,但這部份內存Native是不能使用。 可是你如今去申請2M的Native內存,VM會告訴你沒法分配的,由於如今已使用的內存已經接近峯值了32M(26260+6663=32923 ),因此如今就會成force close 報OOM。