MelonTeam 移动终端前沿技术的探索者

诡异的oom---fd泄漏

2017-12-05
henrikwu

导语 oom一定是因为内存不足吗?未必!

   最近组件更新,三方反馈一个诡异问题outofmemoryerror.

java.lang.OutOfMemoryError: Could not allocate JNI Env
java.lang.Thread.nativeCreate(Native Method)
java.lang.Thread.start(Thread.java:729)
com.tencent.mobileqq.msf.sdk.k.d(MsfServiceProxy.java:197)
com.tencent.mobileqq.msf.sdk.x.onServiceConnected(RemoteServiceProxy.java:59)
android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1475)
android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1492)
android.os.Handler.handleCallback(Handler.java:754)
android.os.Handler.dispatchMessage(Handler.java:95)
android.os.Looper.loop(Looper.java:163)
android.app.ActivityThread.main(ActivityThread.java:6337)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

单看这个异常堆栈,发现是在创建线程时oom。这就很奇怪了,因为这个是发生在daemon进程,这只是一个守护进程并没有高内存的操作,并且打出内存信息发现确实内存还很足。那发生oom就是一个超出我们理解的事情了。

    不明白是为什么。之后三方给了我一个链接https://mp.weixin.qq.com/s/AjtzDxwJzyqC95FXgDPS1g

发现了新大陆,原来fd(文件描述符)超出限制也会导致linux系统抛oom.

再分析我们的组件代码,发现在异常情况下,我们确实会打开大量fd而没有关闭进而导致创建新线程时发现fd不足,进而系统抛出oom.

结论:

    打开的fd一定要及时关闭。


下一篇 Lua 学习手记

说一说

目录