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

时间:2018-01-04 22:30:14

标签: java android java-threads

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

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();

如何防止此错误?或者如何解决? 也许Try-Catch可以做任何工作?

2 个答案:

答案 0 :(得分:1)

为什么不使用Executors?

但是如果你必须启动线程进行测试 - 从配置中选择他们的计数并查看你运行OOM的线程数。

这只会为您提供最佳案例场景,因为Android可用的内存在现实世界中会受到限制,因为其他应用正在运行和/或抢先使用您的应用。

如果您正在运行模拟器,请启动最小尺寸的JVM。

答案 1 :(得分:1)

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

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

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