1. 程式人生 > >android6.0 mediaserver記憶體分配失敗問題

android6.0 mediaserver記憶體分配失敗問題

有客戶反饋視訊播放一段時間就卡住了,且是必現。從logcat資訊上發現是mediaserver程序異常崩潰了,Log如下:

ABI: 'arm'
pid: 246, tid: 1710, name: DecoderAudio  >>> /system/bin/mediaserver <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
    r0 00000000  r1 89c17780  r2 00001180  r3 00000000
    r4 b79822a0  r5 00001200  r6 89c17704  r7 89c17740
    r8 89
c17738 r9 00000000 sl 03598a78 fp 00000000 ip b64234c8 sp 89c176f8 lr b63eaf75 pc b6a8794c cpsr 200f0010 d0 f099f6d8f041f6c2 d1 f108f776f10ef738 d2 f08af7eff0a6f79c d3 f0f3f71df0c6f7ef d4 f171f601f106f624 d5 f366f728f260f699 d6 f5a8f7bff45ff779 d7 f676f741f6c2f7d2 d8 3ef5d867c3ece2a5 d9 412e848000000000
d10 0000000000000000 d11 0000000000000000 d12 0000000000000000 d13 0000000000000000 d14 0000000000000000 d15 0000000000000000 d16 0000000000000000 d17 0000000000000000 d18 3ff0000000000000 d19 4091780000000000 d20 be5ae5d13e0705cf d21 4037f9dcb5112287 d22 bf2a017308872714 d23 3de5d93a5acfd57c d24 3ec71de357b1fe7d d25 3e21e0e0299e8cc5 d26 4037f9dcb5112287 d27 40032e4a2a741b9f d28 3f895d470d6e9486 d29 3f895d470d6e9486 d30 3
fe797c6a435ce85 d31 400921fb54400000 scr 68000012 backtrace: #00 pc 0001694c /system/lib/libc.so (memcpy+112) #01 pc 00042f71 /system/lib/librkffplayer.so (_ZN7android13RkAudioPlayer10queueAudioEPsix+56) #02 pc 0004d509 /system/lib/librkffplayer.so (_ZN7android9FFMPlayer6decodeEPsixxiPv+652) #03 pc 0003167f /system/lib/librkffplayer.so (_ZN12DecoderAudio17SoftDecodeProcessEP8AVPacket+910) #04 pc 00030ea9 /system/lib/librkffplayer.so (_ZN12DecoderAudio6decodeEPv+280) #05 pc 00034203 /system/lib/librkffplayer.so (_ZN12PlayerThread11startThreadEPv+46) #06 pc 000417c7 /system/lib/libc.so (_ZL15__pthread_startPv+30) #07 pc 00019313 /system/lib/libc.so (__start_thread+6)

在導致異常的程式碼附近新增LOG確認了是malloc呼叫返回空指標,記憶體分配失敗了,但檢視kmsg並未發現LMK或者OOM出現。

檢視系統limit沒有問題:

root@rk3288:/ # ulimit -Sa
time(cpu-seconds)    unlimited
file(blocks)         unlimited
coredump(blocks)     0
data(KiB)            unlimited
stack(KiB)           8192
lockedmem(KiB)       64
nofiles(descriptors) 1024
processes            10576
sigpending           10576
msgqueue(bytes)      819200
maxnice              40
maxrtprio            0
resident-set(KiB)    unlimited
address-space(KiB)   unlimited

[email protected]:/ # ulimit -Ha
time(cpu-seconds)    unlimited
file(blocks)         unlimited
coredump(blocks)     unlimited
data(KiB)            unlimited
stack(KiB)           unlimited
lockedmem(KiB)       64
nofiles(descriptors) 4096
processes            10576
sigpending           10576
msgqueue(bytes)      819200
maxnice              40
maxrtprio            0
resident-set(KiB)    unlimited
address-space(KiB)   unlimited

再看mediaserver程序,發現它的address-space被限制在1370941585 bytes:

130|[email protected]:/ # cat /proc/4506/limits                                      
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             10576                10576                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         1370941585           unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       10576                10576                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         40                   40                   
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us    

通過命令修改程序的limit,重新測試視訊正常:

prlimit 4506 9 -1 -1

google從Android6.0開始,對mediaserver程序的虛擬記憶體大小做出了限制,預設值是系統總記憶體的65%,這在普通的手機及平板等產品上沒有問題,但在一些定製的產品,比如低記憶體的電視盒子,或者是多路視訊同時播放的場景,這些產品在播放視訊時候對記憶體的消耗在系統中佔比可能超過65%,從而觸發limit機制導致記憶體申請失敗。

相關推薦

android6.0 mediaserver記憶體分配失敗問題

有客戶反饋視訊播放一段時間就卡住了,且是必現。從logcat資訊上發現是mediaserver程序異常崩潰了,Log如下: ABI: 'arm' pid: 246, tid: 1710, name: DecoderAudio >>> /sy

jvm原始碼閱讀筆記[5]:記憶體分配失敗觸發的GC究竟對記憶體做了什麼?

         在第3篇文章中,我們總結到,當分配記憶體失敗時,會通過VM觸發一次由分配失敗觸發的一次GC,也就是我們經常能在GC日誌裡面看到的“allocation failure” VM_GenCollectForAllocation op(s

記憶體分配失敗錯誤處理

二、C++中的new操作符: C++中的new操作符在分配記憶體失敗時預設的操作是丟擲一個內建的異常,而並不是直接返回空指標;這樣的話,再把返回值與空指標比較,就沒有什麼意義了;因為,C++丟擲異常之後,就直接跳出new操作符所在的那一行程式碼,而不再執行後續的程式碼行了,所以,對new操作符返回值的判斷程式

malloc 記憶體分配失敗很可能的一種原因

堆破壞 程式退出後 vs輸出欄提示: HEAP[mutool.exe]: HEAP: Free Heap block 1eb3e8 modified at 1eb410 after it was freed Windows 已在 mutool.exe 中觸發一個斷點。 其原

android6.0以上開啟熱點失敗

    最近在做手機移動端檔案傳輸app,該專案需要一端開啟熱點,另一端連線該熱點,從而兩個段之間建立區域網,進而通過socket通訊實現檔案傳輸功能,隨著測試的深入,發現,如果設定targetSdkversion >= 23的時候熱點建立失敗。百度了一下,全是許可權

Nexus 5 Android6.0.1 Chrome下載apk失敗的原因分析

裝置 Nexus 5 Android 6.0.1 版本號 M4B30Z Chrome版本 chrome 68.0.3440.70 結論 chrome下載apk時,少發了一次分段網路請求 流程 瀏覽器下載apk的流程一般是先發起一次網路請

Android6.0動態許可權問題,使用PermissionDispatcher自動分配

Android 6.0 許可權問題 Android 6.0對許可權做了區分,將手機的許可權分為危險許可權和非危險許可權; 非危險許可權只要在AndroidManifest中加入許可權申請就可以使用了。 而危險許可權只在AndroidManifest中加入許可權申

[RK3288][Android6.0] 除錯筆記 --- I2C通訊失敗問題

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 使用rk3288的i2c5讀寫時,會出現以下error log: [email prot

Android File.createNewFile失敗; Android6.0以上需要使用者給許可權

1.許可權問題;可具體區分 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">&l

Android6.0 createNewFile mkdir mkdirs均失敗的根因

昨天往專案中新增Android自定義異常捕獲的工具類時(參考Android自定義捕獲Application全域性異常)碰到一件很詭異的事情,createNewFile一直報no such file or directory,往前追發現是mkdir失敗了(mkdirs也一樣f

Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白、異常解決方案(提供模擬記憶體不足導致系統回收記憶體的方案)。

  Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白解決方案。首先提供一個方法模擬記憶體不足導致系統回收記憶體的方案:開啟Android Studio -->Tools-->Android

Android 版本更新下載自動安裝APK,並解決Android6.0安裝失敗的問題

現在APP都有版本更新的功能,有的是跳轉到瀏覽器進行下載,感覺比較麻煩,使用者體驗也不好,簡便的方法就是直接下載安裝即可。即使用Android自帶的DownManager,通過啟動一個後臺服務進行下載,下載完成之後以廣播的形式通知使用者安裝,方便很多。 比較鬧

啟動regionserver失敗記憶體分配不足問題

啟動hbase時,regionserver啟動失敗 報錯: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x

Android native記憶體分配1.0-

Context 測試Android native malloc實際記憶體分配的體現 程式碼 buttno點選一次呼叫一次分配 extern "C" JNIEXPORT void JNICALL Java_com_albertsnow_graphicdemo_

Android6.0機型上調用系統相機拍照返回的resultCode值始終等於0的問題

cti man img pan mission get target lan out 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 正常情況下調用系統相機拍照: 如果拍照後點擊的是“確定”圖標,返回的resultCode = -1(Acti

Android6.0運行時權限(基於RxPermission開源庫)

art cti 將不 轉載 誤差 title 特殊 什麽是 roi 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 前言   在6.0以前的系統,都是權限一刀切的處理方式,只要用戶安裝,Manifest申請的權限都會被賦予,並且安裝後權限也撤銷不了。   And

Android6.0權限管理以及使用權限該註意的地方

結果 res hone grant 設備 -m hid 頁面 start Android 6.0 Marshmallow首次增加了執行時權限管理,這對用戶來說,能夠更好的了解、控 制 app 涉及到的權限。然而對開發人員來說卻是一件比較蛋疼的事情。須要兼

Android6.0------權限申請RxPermissions

級別 req 案例 lean err quest ava ive phone 前面寫了Android6.0權限介紹和權限單個,多個申請,用的是純Java代碼,本文主要說的是借助第三方庫來實現權限申請。 借助第三方庫 RxPermissions來申請6.0權限。 RxPer

android6.0 關於ble搜索藍牙設備問題

roi access cat iss fine oar 6.0 XML net 參考:http://blog.csdn.net/outdoorsmanm/article/details/50014821 本人的解決方法是在AndroidManifest.xml 文件中添加

Android6.0系統添加那些新特性

文本 第一次 分辨 提升 暴露 per 樣式 一段時間 windows ??? 北京時間9月30日淩晨在美國舊金山舉行2015年秋季新品公布會。在公布會上代號為“M