最近我们项目出现了一些性能问题,在低配手机上会出现大量的 anr 和 oom 的问题(主要是 android 9 10)
在堆栈上的显示大多是:
invalid pthread_t 0x<sanitized> passed to pthread_getcpuclockid
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
backtrace:
#00 pc 0x0000000000054070 /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)
#01 pc 0x00000000000b9110 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_internal_find(long, char const*)+192)
#02 pc 0x00000000000b9030 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_internal_gettid(long, char const*)+8)
#03 pc 0x00000000000b8e24 /apex/com.android.runtime/lib64/bionic/libc.so (pthread_getcpuclockid+24)
#04 pc 0x0000000000498c8c /apex/com.android.art/lib64/libart.so (art::Thread::GetCpuMicroTime() const+40)
#05 pc 0x000000000049898c /apex/com.android.art/lib64/libart.so (art::GetSample(art::Thread*, void*) (.__uniq.52483287290921479263723184702455367361)+204)
#06 pc 0x0000000000498564 /apex/com.android.art/lib64/libart.so (art::Trace::RunSamplingThread(void*)+320)
#07 pc 0x00000000000b8b98 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208)
#08 pc 0x0000000000055794 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
和
java.lang.OutOfMemoryError
Exception java.lang.OutOfMemoryError: std::bad_alloc
at com.facebook.jni.NativeRunnable.run
at android.os.Handler.handleCallback (Handler.java:761)
at android.os.Handler.dispatchMessage (Handler.java:98)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
at android.os.Looper.loop (Looper.java:156)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:233)
at java.lang.Thread.run (Thread.java:776)
如果能够有对这方面有经验的 android 大佬能支援一下帮助解决/定位问题的话,将万分感谢。
(BTW: 我们的项目是用 RN 写的)
有偿
有意向的请联系微信: amFja3lqamNuOTk5Y2w=
万分感谢
1
murmurkerman 3 天前 via iPhone
看下 anr oom 分布,普通内存 4gb 以上设备有没有出现。然后需要通过日志埋点还愿用户路径,尝试本地复现。单堆栈信息不足以推断出问题,需要加额外的日志和诊断数据比如定时获取系统和应用内存大小使用情况。先本地本地尝试复现,使用 profier 看 cpu 和内存变化,dump head 对比下是否有大对象泄漏。
|
2
zdglf 3 天前
没内存了。应该是有泄漏,得排查
|
![]() |
3
moonrailgun OP @murmurkerman 1.5g ~ 2g 手机会出现。日志埋点就是在任何地方都会出现。很奇妙。
内存控制在 400m 左右,基本没上过 500m 头疼的原因是行业均值 0.4%,我们 2%。。。。。 大佬可以私聊? |
4
3630cn2023 3 天前 via Android
leakcanary 本地测速看有没有内存泄漏,要覆盖全部代码
|
![]() |
5
debuggeeker 2 天前
@moonrailgun 2%离谱了
|
![]() |
6
debuggeeker 2 天前
买低配设备本地排查,先跑半个小时 monkey ,然后排查内存泄露情况
|
7
murmurkerman 2 天前 via iPhone
@moonrailgun 2g 设备难,莫非是 Android5.1 之类十年前的设备。低端设备加上非原生的应用难,这类设备我也没有太好的优化方案。
我之前负责的 flutter 应用在低内存设备 3gb 一下冷启动超过 5 秒,好在 flutter 不运行在 main 线程上没有 anr ,除非不用 flutter ,没救。 建议从数据上说话,说服老板去掉这部分设备的支持。1. 活跃用户机型内存分布。2. 每个内存桶中出现 anr 和 oom 的比例。3. 每个内存桶营收数据。4. 如果是 gp 包,好像只影响这些设备上商店排名。 我觉得直接把最低 sdk 提升到 24 的样子差不多了。 |
8
murmurkerman 2 天前 via iPhone
看漏了。要用 react native 的工具去看。
对 react native 涉猎不多,通过关键词搜索下 react native anr memory leak https://medium.com/@hbnguyen/detecting-and-handling-memory-leaks-in-react-native-apps-1453fea08d4d |
![]() |
9
toby1902 2 天前
|
10
bettesafford24 2 天前
接广告接的太多了
|
11
murmurkerman 2 天前 via iPhone
@toby1902 我还从没见过 dns 崩溃的,神奇。最常见的还是 webview 的一些 bug 。
|
![]() |
12
pursuer 1 天前
试试 android:largeHeap="true"看看能不能抢救下,最好还是把很耗内存的代码处理一下
|