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