在Android中,一個Process 只能使用16M內(nèi)存,如果超過了這個限制就會拋出Android Out Of Memory(OOM) 這個異常。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,臨洮網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:臨洮等地區(qū)。臨洮做網(wǎng)站價格咨詢:028-86922220
為了避免應(yīng)用濫用內(nèi)存,Android 系統(tǒng)會限制應(yīng)用可以申請的最大堆內(nèi)存,超過此限制就會拋出 OOM 異常。
android內(nèi)存不夠了,會觸發(fā)oom機制,lowMemoryKiller會根據(jù)每個進程的oom_adj的等級,依次殺死進程,釋放內(nèi)存。lom會根據(jù)free的內(nèi)存的值,來判斷kill掉哪個等級下的進程。例如當(dāng)空閑內(nèi)存只有64M了。
當(dāng)系統(tǒng)進行大量廣播、或內(nèi)存較緊時,進程可能很快就被砍掉。此問題在開機或FOTA后特別容易發(fā)生。
1、一般是按照CPU的核數(shù)來定義,例如是4核的,一般一個fixed線程池定義為4個線程左右。
2、Android一個進程里面最少包含5個線程,分別為:下圖是創(chuàng)建的一個僅有hello World!頁面的工程,線程包含以下的這些。查看 VMRuntime 的源碼發(fā)現(xiàn) startHeapTaskProcessor()、runHeapTasks()均是native方法。
3、現(xiàn)在的Android手機一般會有多個攝像頭,但根據(jù)其方向可以歸為兩類: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打開攝像頭之前,首先需要獲取相機資源,判斷相機個數(shù) Camera.getNumberOfCameras() 。
4、線程通過java的標(biāo)準(zhǔn)對象Thread 創(chuàng)建. Android 提供了很多方便的管理線程的方法:— Looper 在線程中運行一個消息循環(huán); Handler 傳遞一個消息; HandlerThread 創(chuàng)建一個帶有消息循環(huán)的線程。
線程池的實現(xiàn) ThreadPoolExecutor是線程池的真正實現(xiàn)??匆幌滤闹饕獏?shù):ThreadPoolExecutor執(zhí)行時大致遵循如下規(guī)則: 線程池的分類 Java默認(rèn)實現(xiàn)了4種線程池,它們都是通過配置ThreadPoolExecutor實現(xiàn)的。
AsyncTask: 為 UI 線程與工作線程之間進行快速的切換提供一種簡單便捷的機制。適用于當(dāng)下立即需要啟動,但是異步執(zhí)行的生命周期短暫的使用場景。
在Android中,線程會有那么幾種狀態(tài):創(chuàng)建、就緒、運行、阻塞、結(jié)束。當(dāng)應(yīng)用程序有組件在運行時,UI線程是處于運行狀態(tài)的。
第六個參數(shù)threadFactory為 線程工廠 ,當(dāng)線程池需要創(chuàng)建一個新線程時,使用線程工廠來給線程池提供一個線程。
舉個例子,我們常用的okhttp內(nèi)部也是使用了線程池,它的ThreadPoolExecutor主要是定義在Dispatcher類里面。 使用的是CachedThreadPool。
Android6之前串行執(zhí)行任務(wù),6時候采用線程池里的并行,Android0開始又開始串行(為了避免并發(fā)錯誤),單任可以并行。
.NET框架為每個進程提供了一個線程池,一個線程池有若干個等待操作狀態(tài),當(dāng)一個等待操作完成時,線程池中的輔助線程會執(zhí)行回調(diào)函數(shù)。線程池中的線程由系統(tǒng)管理,程序員不需要費力于線程管理,可以集中精力處理應(yīng)用程序任務(wù)。
android下與多線程有關(guān)的主要有以下幾個類:由于多線程操作目前主要由線程池方式實現(xiàn),所以只重點關(guān)注Executors 線程池的優(yōu)勢: 線程池的實現(xiàn) ThreadPoolExecutor是線程池的真正實現(xiàn)。