Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jvm是否释放线程';线程终止时的堆栈_Java_Multithreading_Exception_Garbage Collection_Out Of Memory - Fatal编程技术网

Java jvm是否释放线程';线程终止时的堆栈

Java jvm是否释放线程';线程终止时的堆栈,java,multithreading,exception,garbage-collection,out-of-memory,Java,Multithreading,Exception,Garbage Collection,Out Of Memory,我使用jvm参数-Xmx1024m在我的机器和客户的机器上运行以下程序 int i=0; while(true) { new Thread().start(); i++; } 这两台机器都有windows7和jdk7 32位 在我的机器上,当我大约3米的时候,我终止了这个过程。在客户的机器上,程序抛出了一个OutOfMemoryError:当i大约为8K时,无法创建新的本机线程 我用jvm参数-Xmx24m重试了这个实验。在这种情况下,当i大约为24K时,客户机器上的程序抛出了相同的错

我使用jvm参数
-Xmx1024m
在我的机器和客户的机器上运行以下程序

int i=0;
while(true)
{
  new Thread().start();
  i++;
}
这两台机器都有
windows7
jdk7 32位

在我的机器上,当我大约3米的时候,我终止了这个过程。在客户的机器上,程序抛出了一个
OutOfMemoryError:当i大约为8K时,无法创建新的本机线程

我用jvm参数
-Xmx24m
重试了这个实验。在这种情况下,当i大约为24K时,客户机器上的程序抛出了相同的错误。如果我使用
-Xss
将线程的堆栈跟踪减少到128K,那么也会有一个小的增量

当线程终止时,客户的机器似乎不会释放线程堆栈


有人遇到过这个问题吗?有什么想法吗

OutOfMemoryError:无法创建新的本机线程


通常意味着您创建的线程比操作系统允许的多,但不一定是线程堆栈空间不足。我会在每次创建之后设置一个产量/睡眠时间,让操作系统跟上进度

您依赖于线程启动和随后消亡速度的详细信息。在一台机器上,线程生成进程超过了线程死亡进程,而在另一台机器上,线程生成进程正好相反。计数器只跟踪创建的线程总数,而不跟踪任何时间点存在的线程净数量

要点:您的测试代码在证明运行时的任何重要方面都没有帮助

当线程终止时,客户的机器似乎不会释放线程堆栈

可能是,也可能不是。这取决于线程何时实际超出范围以及GC何时运行。此外,JVM可能不一定决定立即获取线程堆栈内存,因为它可能希望尝试重用线程,而不是通过将其释放到JVM的另一部分来分割内核。线程的堆栈空间实际上很可能是保留给线程使用的,因此这更多地是关于并发活动(或休眠)线程和重用它们,而不是释放内存


如果要启动这么多线程,我建议您使用固定数量的线程
ExecutorService
,这样您就可以更好地控制启动的线程的精确数量。否则,你就是JVM和GC的一时兴起。

@John Vint你的答案是一个更一般原则的特例:释放任何给定资源的线程应该优先于想要获取相同资源的线程。@Bathsheba有什么目的?我只是不知道这证明了什么,我们可以假设它开始了。@jameslarge我要说的唯一一点是,启动超过操作系统允许的线程(并且已经运行)将引发此异常,仅此而已。对不起,我刚才说的是您在回答中建议调用Thread.yield()的第二句话。这实际上等同于降低主线程的优先级(即,它允许其他线程运行)。示例中的主线程正在获取资源(本机线程),而其他线程正在释放它们。让其他线程优先于主线程可以防止资源耗尽。真正的应用程序每秒创建2-3个线程,因此真正的应用程序需要几个小时才能抛出OutOfMemoryError:无法创建新的本机线程。我不想计算并发线程的最大数量,但想了解为什么我的应用程序在客户的机器上抛出异常。你的应用程序的问题是线程永远不会死。这与JVM无法释放死线程的资源无关。你说的“线程永远不会死”是什么意思?我应该调用什么来杀死线程?当线程的
run
方法完成时,线程死亡。您的
run
方法未完成。我不知道为什么。