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

问题描述 投票:-3回答:2

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

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

如何防止这个bug?或者如何解决?也许Try-Catch可以做任何工作?

java android java-threads
2个回答
1
投票

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

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

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


1
投票

为什么不使用Executors?

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.