java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
文章目录
- java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again异常分析及解决
- 问题描述:
- 问题分析:
- 代码定位思路:
- 行动:
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again异常分析及解决
问题描述:
我的项目是使用viewPager循环播放图片、vr、视频资源,连续播放4个小时左右会崩溃报错:
08-13 16:19:08.472 E/OMXNodeInstance( 4129): setParameter(1021055c:amlogic.avc.decoder.awesome, OMX.google.android.index.storeMetaDataInBuffers(0x7f000002): Output:1 en=1 type=1) ERROR: BadPortIndex(0x8000101b)
08-13 16:19:08.472 E/ACodec (28956): [OMX.amlogic.avc.decoder.awesome] storeMetaDataInBuffers failed w/ err -2147483648
08-13 16:19:08.476 E/OmxVideoDecoder( 4129): reset input buffer:1920000
08-13 16:19:08.480 E/OMXNodeInstance( 4129): setConfig(1021055c:amlogic.avc.decoder.awesome, ConfigPriority(0x6f800002)) ERROR: UnsupportedIndex(0x8000101a)
08-13 16:19:08.499 E/OmxVideoDecoder( 4129): set output error, new BufferCountActual = 9
08-13 16:19:08.499 E/OMXNodeInstance( 4129): setParameter(1021055c:amlogic.avc.decoder.awesome, ParamPortDefinition(0x2000001)) ERROR: UnsupportedSetting(0x80001019)
08-13 16:19:08.500 E/OmxVideoDecoder( 4129): set output error, new BufferCountActual = 8
08-13 16:19:08.500 E/OMXNodeInstance( 4129): setParameter(1021055c:amlogic.avc.decoder.awesome, ParamPortDefinition(0x2000001)) ERROR: UnsupportedSetting(0x80001019)
08-13 16:19:08.500 E/OmxVideoDecoder( 4129): set output error, new BufferCountActual = 7
08-13 16:19:08.500 E/OMXNodeInstance( 4129): setParameter(1021055c:amlogic.avc.decoder.awesome, ParamPortDefinition(0x2000001)) ERROR: UnsupportedSetting(0x80001019)
08-13 16:19:08.596 E/OMXNodeInstance( 4129): setConfig(1021055d:google.aac.decoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001)
08-13 16:19:09.222 E/audio_route( 4122): unable to find path 'hdmi'
08-13 16:19:10.348 E/SoftAAC2( 4129): ...EOS Delay Time 200000 us
08-13 16:19:10.393 E/OMXNodeInstance( 4129): setConfig(1021055e:google.aac.decoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001)
08-13 16:19:11.229 E/CrashReport(28956): Java Crash Happen cause by ExoPlayerImplInternal:Handler(360)
08-13 16:19:11.576 E/CrashReport(28956): stack frame :17, has cause false
08-13 16:19:12.229 E/CrashReport(28956): #++++++++++Record By Bugly++++++++++#
08-13 16:19:12.229 E/CrashReport(28956): # You can use Bugly(http:\\bugly.qq.com) to get more Crash Detail!
08-13 16:19:12.231 E/CrashReport(28956): # PKG NAME: com.qiaofang.qfangadtv
08-13 16:19:12.231 E/CrashReport(28956): # APP VER: 1.0.7.3
08-13 16:19:12.245 E/CrashReport(28956): # LAUNCH TIME: 2019-08-13 10:43:28
08-13 16:19:12.245 E/CrashReport(28956): # CRASH TYPE: JAVA_CRASH
08-13 16:19:12.246 E/CrashReport(28956): # CRASH TIME: 2019-08-13 16:19:12
08-13 16:19:12.246 E/CrashReport(28956): # CRASH PROCESS: com.qiaofang.qfangadtv
08-13 16:19:12.247 E/CrashReport(28956): # CRASH THREAD: ExoPlayerImplInternal:Handler
08-13 16:19:12.247 E/CrashReport(28956): # REPORT ID: cde8a724-52ed-4b0f-845e-ed8ef94e74f7
08-13 16:19:12.248 E/CrashReport(28956): # CRASH DEVICE: TX3 Mini ROOTED
08-13 16:19:12.248 E/CrashReport(28956): # RUNTIME AVAIL RAM:208900096 ROM:4055703552 SD:4055703552
08-13 16:19:12.249 E/CrashReport(28956): # RUNTIME TOTAL RAM:880025600 ROM:4431564800 SD:4431564800
08-13 16:19:12.249 E/CrashReport(28956): # CRASH STACK:
08-13 16:19:12.249 E/CrashReport(28956): java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
08-13 16:19:12.249 E/CrashReport(28956): at java.lang.Thread.nativeCreate(Native Method)
08-13 16:19:12.249 E/CrashReport(28956): at java.lang.Thread.start(Thread.java:730)
08-13 16:19:12.249 E/CrashReport(28956): at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:941)
08-13 16:19:12.249 E/CrashReport(28956): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1348)
08-13 16:19:12.249 E/CrashReport(28956): at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:591)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.upstream.Loader$LoadTask.execute(Loader.java:411)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.upstream.Loader$LoadTask.start(Loader.java:285)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.upstream.Loader.startLoading(Loader.java:180)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.source.ExtractorMediaPeriod.startLoading(ExtractorMediaPeriod.java:657)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.source.ExtractorMediaPeriod.prepare(ExtractorMediaPeriod.java:209)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.maybeUpdateLoadingPeriod(ExoPlayerImplInternal.java:1495)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.updatePeriods(ExoPlayerImplInternal.java:1367)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:495)
08-13 16:19:12.249 E/CrashReport(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
08-13 16:19:12.249 E/CrashReport(28956): at android.os.Handler.dispatchMessage(Handler.java:98)
08-13 16:19:12.249 E/CrashReport(28956): at android.os.Looper.loop(Looper.java:154)
08-13 16:19:12.249 E/CrashReport(28956): at android.os.HandlerThread.run(HandlerThread.java:61)
08-13 16:19:12.249 E/CrashReport(28956): #++++++++++++++++++++++++++++++++++++++++++#
08-13 16:19:12.881 E/CrashReport(28956): [Util] Failed to start a thread to execute task with message: pthread_create (1040KB stack) failed: Try again
08-13 16:19:12.882 E/CrashReport(28956): [UploadManager] Failed to start a thread to execute synchronized upload task, add it to queue.
08-13 16:19:12.882 E/CrashReport(28956): sys default last handle start!
08-13 16:19:12.902 E/AndroidRuntime(28956): FATAL EXCEPTION: ExoPlayerImplInternal:Handler
08-13 16:19:12.902 E/AndroidRuntime(28956): Process: com.*****.*****, PID: 28956
08-13 16:19:12.902 E/AndroidRuntime(28956): java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
08-13 16:19:12.902 E/AndroidRuntime(28956): at java.lang.Thread.nativeCreate(Native Method)
08-13 16:19:12.902 E/AndroidRuntime(28956): at java.lang.Thread.start(Thread.java:730)
08-13 16:19:12.902 E/AndroidRuntime(28956): at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:941)
08-13 16:19:12.902 E/AndroidRuntime(28956): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1348)
08-13 16:19:12.902 E/AndroidRuntime(28956): at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:591)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.upstream.Loader$LoadTask.execute(Loader.java:411)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.upstream.Loader$LoadTask.start(Loader.java:285)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.upstream.Loader.startLoading(Loader.java:180)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.source.ExtractorMediaPeriod.startLoading(ExtractorMediaPeriod.java:657)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.source.ExtractorMediaPeriod.prepare(ExtractorMediaPeriod.java:209)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.maybeUpdateLoadingPeriod(ExoPlayerImplInternal.java:1495)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.updatePeriods(ExoPlayerImplInternal.java:1367)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:495)
08-13 16:19:12.902 E/AndroidRuntime(28956): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:301)
08-13 16:19:12.902 E/AndroidRuntime(28956): at android.os.Handler.dispatchMessage(Handler.java:98)
08-13 16:19:12.902 E/AndroidRuntime(28956): at android.os.Looper.loop(Looper.java:154)
08-13 16:19:12.902 E/AndroidRuntime(28956): at android.os.HandlerThread.run(HandlerThread.java:61)
08-13 16:19:13.047 E/Binder ( 4438): Caught an OutOfMemoryError from the binder stub implementation.
08-13 16:19:13.047 E/Binder ( 4438): java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
08-13 16:19:13.047 E/Binder ( 4438): at java.lang.Thread.nativeCreate(Native Method)
08-13 16:19:13.047 E/Binder ( 4438): at java.lang.Thread.start(Thread.java:730)
08-13 16:19:13.047 E/Binder ( 4438): at com.android.server.am.ActivityManagerService.addErrorToDropBox(ActivityManagerService.java:14036)
08-13 16:19:13.047 E/Binder ( 4438): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:13595)
08-13 16:19:13.047 E/Binder ( 4438): at com.android.server.am.ActivityManagerService.handleApplicationCrash(ActivityManagerService.java:13579)
08-13 16:19:13.047 E/Binder ( 4438): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1646)
08-13 16:19:13.047 E/Binder ( 4438): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2807)
08-13 16:19:13.047 E/Binder ( 4438): at android.os.Binder.execTransact(Binder.java:565)
08-13 16:19:13.149 E/JavaBinder( 4438): *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
08-13 16:19:13.149 E/JavaBinder( 4438): java.lang.RuntimeException: Out of memory
08-13 16:19:13.149 E/JavaBinder( 4438): at android.os.Binder.execTransact(Binder.java:584)
08-13 16:19:13.149 E/JavaBinder( 4438): Caused by: java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
08-13 16:19:13.149 E/JavaBinder( 4438): at java.lang.Thread.nativeCreate(Native Method)
08-13 16:19:13.149 E/JavaBinder( 4438): at java.lang.Thread.start(Thread.java:730)
08-13 16:19:13.149 E/JavaBinder( 4438): at com.android.server.am.ActivityManagerService.addErrorToDropBox(ActivityManagerService.java:14036)
08-13 16:19:13.149 E/JavaBinder( 4438): at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:13595)
08-13 16:19:13.149 E/JavaBinder( 4438): at com.android.server.am.ActivityManagerService.handleApplicationCrash(ActivityManagerService.java:13579)
08-13 16:19:13.149 E/JavaBinder( 4438): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:1646)
08-13 16:19:13.149 E/JavaBinder( 4438): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2807)
08-13 16:19:13.149 E/JavaBinder( 4438): at android.os.Binder.execTransact(Binder.java:565)
08-13 16:19:13.481 E/OMXNodeInstance( 4129): !!! Observer died. Quickly, do something, ... anything...
08-13 16:19:13.481 E/OMXNodeInstance( 4129): !!! Observer died. Quickly, mName:=amlogic.avc.decoder.awesome
08-13 16:19:13.482 E/OMXNodeInstance( 4129): !!! Observer died. Quickly, do something, ... anything...
08-13 16:19:13.482 E/ThreadWorker( 4129): pthread on exit wait clean
问题分析:
从log中可以看到java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again 内存溢出的运行时异常,但是可以肯定的是app没有内存过高,很不解,再看后面的pthread_create failed可知是在创建线程时报的内存溢出,创建线程怎么会造成内存溢出呢?第一次遇到 只能先找度娘求救了,找到一篇不可思议的OOM ,从这篇博客的讲解可知是线程数过多造成的内存溢出(具体原因分析可查看上述链接)。问题原因可以基本确定了,可是log中无法定位到具体项目代码。
代码定位思路:
思路很明确,找到频繁创建线程的地方
行动:
首先是分析项目代码,比如使用Glide.with(Application.getApplicationContext()),这里为了规避内存泄漏传入了app的上下文而不是所在的组件的,我的想法是这样可能会造成图片加载的线程的声明周期过长不能及时关闭,所以就把传入的上下文又改成了组件的,但是测试后无效。
其次就是轮训检测app的线程数,既然是线程太多造成的,那就看在什么时候线程会增多,方法:
Map<Thread, StackTraceElement[]> threadMap = Thread.getAllStackTraces();threadMap.entrySet().size()另外就是设备支持的线程数private val CPU_COUNT = Runtime.getRuntime().availableProcessors()//核心线程数量大小private val corePoolSize = Math.max(2, Math.min(CPU_COUNT - 1, 4))//线程池最大容纳线程数private val maximumPoolSize = CPU_COUNT * 2 + 1
测试发现CPU_COUNT 为1 ,最大容纳线程数为3,但是 threadMap.entrySet().size()为70.。。。。。一脸蒙蔽。
3. 既然代码里分析不出,那就借助工具吧,第一个想到的当然就是AS自带的profiler(使用方法详见Android性能优化之CPU Profiler)了,里面有cpu的使用情况和线程总数,下图中标红位置:
图中线程数53是我问题修复后的数值,修复前会随着app播放时长的累加慢慢增加到几百崩的时候估计就上千了,左边有个threads下拉框可以查看所有线程信息,可以看到基本所有线程都是sleep的,所以Thread.getAllStackTraces()这个方法拿到的是存在的线程数而不是正在执行的线程数,但是很明显sleep中的线程也是在占用资源的,因此猜测崩溃是由于存放线程的栈溢出了。那么是哪里创建的线程呢,还是无法明确定位,一个方法就是看上图中app在什么时候会增加了线程数后没有回到原来的数值(对比其他app可知正常情况下上图中线程数增加后会再回到原来的值,简言之就是会上下波动而不是持续增加),后来发现是在视频加载资源的时候有一段无用的代码没注释掉:
fun getProxy(context: Context): HttpProxyCacheServer? {val app = context.applicationContext as Appreturn app.proxy ?: app.newProxy()}
HttpProxyCacheServer proxy = getProxy(App.Companion.getApp().getApplicationContext());
String proxyUrl = proxy.getProxyUrl(url);
注释掉后问题解决,从上述代码可知getProxyUrl方法内没做非空验证,每次get都会创建一个(newProxy())新的HttpProxyCacheServer ,而且没有地方调用stop,造成每次播放视频都会增加一个线程(sleep状态)。
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again相关推荐
- Throwing OutOfMemoryError “pthread_create (1040KB stack) failed: Try again“
不可思议的OOM 作者: 陶菜菜 不要过度创建线程才是最好的OOM 线程安全措施 摘要: 本文发现了一类OOM(OutOfMemoryError),这类OOM的特点是崩溃时java堆内存和设备物理内 ...
- java.lang.OutOfMemoryError
近日,用Bugly追踪到一个奇怪的崩溃: # OkHttp Dispatcher(1604) java.lang.OutOfMemoryError pthread_create (1040KB sta ...
- Android oom pthread_create (1040KB stack)分析及解决
首先看一下错误信息如下 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory at j ...
- Android之java.lang.OutOfMemoryError: Failed to allocate a ** byte allocation with **free bytes and 2M
1 问题 glide加载图片出现oom java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2 ...
- Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Compressed class space
目录 主要得报错信息如下: 解决办法 主要得报错信息如下: 2022-05-16 07:56:47.702|ERROR|http-nio-8089-exec-11|46|c.g.d.npp.web.c ...
- 解决“java.lang.OutOfMemoryError: Failed to allocate a allocation until OOM”错误
1.参考:解决"java.lang.OutOfMemoryError: Failed to allocate a allocation until OOM"错误_SEVENY_的博 ...
- Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space 解决方法 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主 ...
- [JVM-翻译]揭开java.lang.OutOfMemoryError面纱之一
Java.lang.OutOfMemoryError是什么 Java.lang.OutOfMemory是java.lang.VirtualMachineError的一个子类,当Java虚拟机中断,或 ...
- Exception in thread http-bio-80exec-1 java.lang.OutOfMemoryError: PermGen s解决方案
问题描述: Exception in thread ""http-bio-80"-exec-1" java.lang.OutOfMemoryError: Per ...
最新文章
- 计算点云之间的平均距离,方差,标准差
- Python零基础自学会有哪些弊端
- asp.net C# 实现上传Excel文件导入数据到SQL Server 数据库
- 实训七(项目准备与创建)
- Vue + Element UI——对话框式登录框DEMO
- 犯了一个连接数据库的低级错误
- vue 后端返回二进制流文件,前端如何实现下载?
- B1922 [Sdoi2010]大陆争霸 最短路
- windows下mysql+apache+php配置
- 解决sklearn库使用过程中No module named model_selection的错误
- 文字时钟罗盘动态html代码_文字时钟罗盘动态html代码工具-文字时钟APP最新版下载-游戏窝...
- S3存储服务间数据同步工具Rclone迁移教程
- 实用计算机相关日语词汇,日语分类词汇:计算机类(1)
- 有没有测试牙齿需不需要修正的软件,三步图测法,就能知道自己牙齿是否需要矫正...
- selenium实现高校班级打卡-石墨文档每日一报自动化
- win7 桌面计算机不显示器,教你解决win7检测不到第二个显示器的方法
- opencv 图像填充
- 【收藏】2018年不容错过的20大人工智能/机器学习/计算机视觉等顶会时间表
- 【计算机网络-1】为什么学习计算机网络
- smartq ten3 android4,智器(SmartQ)Ten3 MID视频测试评测-ZOL中关村在线