分析:
Android系统会给每个应用分配一个内存空间(不同的系统分配的内存大小不同),这块内存空间大小是有限的。
创建线程需要占用内存空间,
不可能拿有限的内存空间创建无限的线程。
结论:
Android线程是有上限的。如果应用创建线程的数量过多,而没有及时释放会导致OOM
测试代码:
private void createThread() {
while (true) {
new Thread(new Runnable() {
@Override
public void run() {
try {
long thread = Thread.currentThread().getId();
Log.d("creatthread", "开启线程:" + thread);
Thread.sleep(1000 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
报错日志:
D/creatthread: 开启线程:11000
....
D/creatthread: 开启线程:18101
W/libc: pthread_create failed: couldn't mprotect TLS: Out of memory
W/zygote64: Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Try again"
D/AndroidRuntime: Shutting down VM
2019-08-06 11:34:45.133 25384-25384/com.cloud.wd.custom E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cloud.wd.custom, PID: 25384
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:733)
at com.cloud.wd.custom.MainActivity.createThread(MainActivity.java:159)
at com.cloud.wd.custom.MainActivity.access$200(MainActivity.java:29)
at com.cloud.wd.custom.MainActivity$14.onClick(MainActivity.java:125)
at android.view.View.performClick(View.java:6311)
at android.view.View$PerformClick.run(View.java:24833)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:173)
at android.app.ActivityThread.main(ActivityThread.java:6653)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:821)
如有错误,请求指正