-
栈的OOM (目前在华为手机上常见 应该ROM限制每个APP只能创建500左右的线程)
- 异常打印 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory
- 注意异常打印, 后面有 stack标记
- 在Java层不断new Thread.start
- ThreadNum = 475 @ 华为荣耀V10
- 崩溃时java堆内存和设备物理内存都充足
- stack上的内存不需要GC,因为内存会在函数退出时回收
- 异常打印 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory
-
创建线程时出现栈溢出的原因:
- thread的栈内存是相互独立的
- 对于java,分配线程栈资源是在调用start()后开始,会调用native方法创建线程并获取相关资源,然后调用线程的run()方法
- 操作系统进程数限制通常比较大,但栈内存限制比较小
-
栈大小:
- Dalvik上把java和native stack分开,默认java stack是32KB,native stack是1MB
- ART一般情况线程栈的大小和Dalvik是一样的
- https://developer.android.com/guide/practices/verifying-apps-art.html
- 还有一个为了避免StackOverFlow的额外的8K 再加上Native的1MB 总量是1056KB
- pthread_attr_getstacksize 返回的: 小米5 1016KByte 荣耀V10 1008KByte 但实际可以多几个KByte
- ulimit -a 看到的 stack(KiB) 8192 不准确(不清楚原因)
-
Native的栈溢出
- SIGSEGV
- 不能超过1M
- 递归或者数组过大
- 观察Debug.Meminfo获取的otherPrivateDirty和otherPss会增大
- otherPss区别与dalvikPss nativePss,包含C/C++的非堆内存(包含栈内存)
- otherPss是dumpsys meminfo 返回 TOTAL - GL_mtrack - Native_Heap - Dalvik_Heap
- dumpsys meminfo 中 Unknown一行 PrivateDirty反映函数中栈内存 比如int8_t temp[1024*1024]
-
Notifications
You must be signed in to change notification settings - Fork 3
CatDroid/CodecANativeWin
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
About
Android JNI层应用
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published