system_server 报oom
02-13 21:19:00.236 1122 1138 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: ActivityManager
02-13 21:19:00.236 1122 1138 E AndroidRuntime: java.lang.OutOfMemoryError: Could not allocate JNI Env
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at java.lang.Thread.nativeCreate(Native Method)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at java.lang.Thread.start(Thread.java:1063)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService$PackageUsage.write(PackageManagerService.java:1162)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService.performDexOpt(PackageManagerService.java:7260)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService.performDexOptIfNeeded(PackageManagerService.java:7240)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.ActivityManagerService.ensurePackageDexOpt(ActivityManagerService.java:3462)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue.processCurBroadcastLocked(BroadcastQueue.java:310)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1210)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:205)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:111)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.Looper.loop(Looper.java:207)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:46)
02-13 21:19:00.236 1122 1138 I am_crash: [1122,0,system_server,-1,java.lang.OutOfMemoryError,Could not allocate JNI Env,Thread.java,-2]
查看上下文:
02-13 21:19:00.208 1122 1138 E art : ashmem_create_region failed for 'indirect ref table': Too many open files
02-13 21:19:00.208 1122 1138 W art : Throwing OutOfMemoryError "Could not allocate JNI Env"
应该是fd泄露,造成的问题,
使用 GAT 查看mtk log
db.fatal.00.JE.dbg 解析出的PROCESS_FILE_STAE 文件:
由此文件可以看出,系统的 socket 过多达到了700 多个,手机正常应该在 100 个左右,
socket泄露造成的此问题,
即可
之后创建 input channel 时会有 log:
Input channel constructed: name= *****
销毁input channel 时会有log:
02-13 21:19:00.236 1122 1138 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: ActivityManager
02-13 21:19:00.236 1122 1138 E AndroidRuntime: java.lang.OutOfMemoryError: Could not allocate JNI Env
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at java.lang.Thread.nativeCreate(Native Method)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at java.lang.Thread.start(Thread.java:1063)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService$PackageUsage.write(PackageManagerService.java:1162)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService.performDexOpt(PackageManagerService.java:7260)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.pm.PackageManagerService.performDexOptIfNeeded(PackageManagerService.java:7240)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.ActivityManagerService.ensurePackageDexOpt(ActivityManagerService.java:3462)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue.processCurBroadcastLocked(BroadcastQueue.java:310)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1210)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:205)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:111)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.Looper.loop(Looper.java:207)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)
02-13 21:19:00.236 1122 1138 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:46)
02-13 21:19:00.236 1122 1138 I am_crash: [1122,0,system_server,-1,java.lang.OutOfMemoryError,Could not allocate JNI Env,Thread.java,-2]
查看上下文:
02-13 21:19:00.208 1122 1138 E art : ashmem_create_region failed for 'indirect ref table': Too many open files
02-13 21:19:00.208 1122 1138 W art : Throwing OutOfMemoryError "Could not allocate JNI Env"
应该是fd泄露,造成的问题,
使用 GAT 查看mtk log
db.fatal.00.JE.dbg 解析出的PROCESS_FILE_STAE 文件:
由此文件可以看出,系统的 socket 过多达到了700 多个,手机正常应该在 100 个左右,
socket泄露造成的此问题,
system_server 的socket泄露往往是因为Input Channel 没有关闭, 需要将InputTransport.cpp 文件中的debug开关打开,复现,进一步定位:
可以去
framework/native/libs/input/InputTransport.cpp
文件中看一下如何,打开调试开关。
在市场部分手机上可以通过:
方法1、
adb shell setprop debug.inputclient.enable 1
方法2、
adb shell setprop debug.inputlog.enabled true
adb shell dumpsys input即可
之后创建 input channel 时会有 log:
Input channel constructed: name= *****
销毁input channel 时会有log:
Input channel destroyed: name= ******
没有复现啊。
还需要深入理解一下socket 。
socket相关的工具
ss netstat lsof