运行 线程太多 - java.lang.OutOfMemoryError

Running too many threads - java.lang.OutOfMemoryError

出于某些测试目的,我在我的应用程序中创建了太多这样的线程,但有时当我将线程数设置得太高时,它会崩溃并显示

java.lang.OutOfMemoryError:
at java.lang.Thread.nativeCreate (Thread.java)
at java.lang.Thread.start (Thread.java:731)


new Thread(new Runnable() {
            @Override
            public void run() {
                while (!stop) {

                }
            }
        }).start();

如何防止这个错误?或者如何解决? 也许试试 - Catch 可以完成任何工作?

为什么不使用执行器?

但是如果您必须启动线程进行测试 - 从配置中选择它们的数量并查看您的线程数是多少 运行 OOM。

这只会给你最好的情况,因为 Android 可用的内存在现实世界中会因为其他应用 运行 宁和/或抢占而受到限制你的应用程序。

如果您运行使用模拟器启动最小尺寸的 JVM。

解释一下为什么 JVM在创建太多线程时会抛出OOM,原因是每个线程都为自己的堆栈分配内存。内存有限,线程数也有限。默认情况下线程的堆栈有多大取决于您的 JVM,在 Hotspot 上我相信它是 ~1M,但不知道 Android。您应该能够检查:java -XX:+PrintFlagsFinal -version | grep ThreadStackSize。可以使用 -Xss 参数控制此设置。

解决方案是降低线程的内存使用率。为此,您可以使用 -Xss 值减少每个线程的堆栈大小,并减少您创建的线程数。在扣除堆、其他区域和 JVM 内部消耗的内存后,您能负担得起多少取决于主机上 JVM 可用的内存。大致(总内存 - (jvm 使用的所有内存))/ -Xss。

当然,按照其他答案中的建议使用 Executors 可以帮助您定义线程数量有限的池,并向其提交工作(而不是创建无限线程。)