运行 线程太多 - 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 可以帮助您定义线程数量有限的池,并向其提交工作(而不是创建无限线程。)
出于某些测试目的,我在我的应用程序中创建了太多这样的线程,但有时当我将线程数设置得太高时,它会崩溃并显示
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 可以帮助您定义线程数量有限的池,并向其提交工作(而不是创建无限线程。)