在Android 使用的是davilk虛擬機 它和java虛擬機 相似 可是它是使用基於寄存器的 java基於棧的
davilk虛擬機的 編譯出來的文件也不一樣 它是擁有 一個dex文件有多個class 而java虛擬機是 一個文件對應一個classjava
davilk虛擬機 是先編譯成class 文件 而後經過 dx 工具在打包成一個dex文件。android
一個android app 就是一個davilk虛擬機 它是由zygote進程中davilk虛擬機 複製過來的。web
在Android啓動中 davilk虛擬機 java object heap size navtive heap size
java object heap 是有限制的 能夠經過 root adb shell cat /system/build.prop 來查看 navtive heap size 大機率是沒有限制shell
android 的 前臺進程 0 可見進程 後臺進程 11 服務5 服務8 空進程 -11--16markdown
若是兩個進程都是後臺進程 11 那麼 誰佔用的內存大就回收誰。 因此內存回收很是重要網絡
如何 查看 adb shell cat /proc/pid/oom_adjapp
OOM問題:ide
內存泄漏: 當應用週期內 再也不使用的對象被GC ROOTS引用 致使不能回收 會使實際可用的java 堆內存變小 就會發生內存泄漏工具
內存泄漏 超過單個應用最大的使用內存,超出這個值就會OOM大數據
OOM 有不少中 不必定是 超過最大使用堆內存
OOM
1. JAVA堆內存溢出
2. 無足夠的連續空間
3. FD數量超過限制
4. 線程數量超過限制
5. 虛擬內存不足
複製代碼
咱們能夠使用 adb shell dumpsys meminfo --package 包名
從下載hprof後 要經過Android sdk 中platm-tools hprof-conv.exe 來轉換成MAT所須要的文件
out-coming 是 該對象中引用了誰 in-comeing 是 誰引用了該對象
地圖中 BitMapFactory.Option 參數 中有個參數 inJustDecodeBounds=true 能夠不加載圖片不分配內存,但會返回圖片的寬度和高度。 而後 經過samleSize來縮放圖片比例
1個像素 有一個參數Config ALPHA(1) 是佔1個字節(byte) RGB_565是佔2個字節(byte)
ARGB_888是佔4個字節 ARGB_F16佔 8個字節(byte) 、
在Android圖片中佔用的內存大小是
那麼大小就是
1920x1080像素 佔多少內存 1920x1080x4x((設備密度/圖片所在文件夾的密度)^2)/1024= KB
mdpi hdpi xdpi xxdpi xxxdpi 160 240 320 480 560
可是在文件和網絡上加載的圖片就沒有1920x1080x4/1024=kb
8bit(位)=1Byte(字節)
1024Byte(字節)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
Bitmap的內存模型 Android 3.0-4.4 bitMap對象保存在java Heap 像素數據保存在 native Heap Android 5.0-7.0 bitmap對象保存在java Heap 像素數據保證在 java Heap Android 8.0 bimap對象保存在java Heap 像素數據保存在 native Heap
內存優化總體思想:
LeakCanary 內存檢測工具
兩部分 1.找出泄漏的嫌疑的對象。原理 2.確診:haha開源庫 利用這個可達性分析
LeakCanary的原理 在ActivityThread中的bindAppcalition方法 ContentProvider.onCreate 會比Appcaliton.onCreate 更早執行
LeakCanary檢測Activity退出的原理
ActivityLifecycleCallbacks 能夠監聽Activity的生命週期 Fragment的生命週期
JAVA四種引用和引用隊列ReferenceQueue的關係
複製代碼
當弱引用 WeakReference weakReference=new WeakReference(obj,referenceQueue)
leakcanary watch 一個對象5s 加入觀察列表