官术网_书友最值得收藏!

1.2.4 新的問題

經過上一輪的優化,在內存監視器里新版本的Heap內存表現已經比較好了,新功能只消耗了幾萬字節到幾十萬字節內存。但是要注意的是,Heap內存并不是應用的全部,我們在設置或其他管理工具里看到的應用內存大小是應用整個進程的內存使用量。也有可能出現Heap部分完全沒有增長而其他部分增長的情況。

要觀察進程的內存使用情況,就需要用到其他的觀測工具,Android里最常用于觀察進程內存的方法就是dumpsys meminfo <package name/pid>命令。

對我們的新版應用執行該命令,能夠得到以下的輸出結果:

        ** MEMINFO in pid 17481 [com.example] **
                                  Shared   Private      Heap      Heap      Heap
                            Pss     Dirty     Dirty      Size     Alloc      Free
                        ------    ------    ------    ------    ------    ------
                Native         28          8         28      5744      3739      1117
          Dalvik Heap     10112     10224      9624     14076     10386      3690
          Dalvik Other      3212      3076          0          0
                 Stack        270        270          0          0
                Ashmem          2          0          0          0
             Other dev          7          0          4          0
              .so mmap       1867       1330        160          0
             .jar mmap          4          0          4          0
             .apk mmap      2944           0       2690          0
             .dex mmap      4110          64       3420          0
            Other mmap         16          4          4          0
               Unknown       2351       2331          0          0
                 TOTAL      24895      12404       6212          0

在以上輸出結果中,左邊Pss列的數據標識進程各部分對真實物理內存的消耗,左下角的TOTAL值就是我們在各種管理工具里看到的應用內存消耗。

而Android Studio等工具里顯示的內存值,在這里是Dalvik Heap Alloc部分。根據以上的數據,我們可以看到Dalvik Heap和Heap Alloc不是相等的,而且除了Dalvik Heap之外,還有其他很多部分也會消耗內存。

這時候我們再對比一下舊版,看看是否也如此:

        ** MEMINFO in pid 14233 [com.example] **
                                  Shared   Private      Heap      Heap      Heap
                            Pss     Dirty     Dirty      Size     Alloc      Free
                        ------    ------    ------    ------    ------    ------
                Native         28          8         28      5664      3767      1040
          Dalvik Heap      8026     10372      7508     11784     10113      1671
          Dalvik Other     3159      3076          0          0
                Stack        260        260          0          0
                Ashmem          2          0          0          0
             Other dev          7          0          4          0
               .so mmap      1887       1344        160          0
             .jar mmap          4          0          4          0
              .apk mmap      2941          0       2680          0
              .dex mmap      4013         64       3360          0
            Other mmap         16          4          4          0
                Unknown      2256      2244           0          0
                  TOTAL     22599     17372       13716          0

這時候就會發現問題了,Heap Alloc沒增加多少,但Dalvik Heap Pss增加了許多。而其他部分基本保持不變或有少量增長??梢妴栴}還是出現在Dalvik Heap部分,但只靠檢查分配的對象是看不出來問題的。

Java代碼的內存分配和釋放都是由虛擬機管理的,那么這個問題會是虛擬機的問題嗎?我們接下來繼續通過虛擬機部分機制來探索這些內存增長的原因。

主站蜘蛛池模板: 滨州市| 谢通门县| 密云县| 奉化市| 新竹市| 昭通市| 万源市| 麻城市| 调兵山市| 左云县| 黄平县| 锡林浩特市| 且末县| 彭州市| 溧阳市| 伊吾县| 商河县| 元氏县| 江北区| 和田市| 隆化县| 莱芜市| 宜兰市| 托克逊县| 克东县| 安溪县| 辰溪县| 攀枝花市| 台北市| 富民县| 望都县| 中超| 阿拉善盟| 安新县| 富平县| 三穗县| 贵阳市| 青岛市| 湘西| 康马县| 沁阳市|