我在我的计算机和客户的计算机上使用 jvm 参数 -Xmx1024m
运行以下程序。
int i=0;
while(true)
{
new Thread().start();
i++;
}
两台机器都有windows 7
和jdk 7 32bits
。
在我的机器上,当 i 约为 3M 时,我终止了该进程。在客户的机器上,当 i 约为 8K 时,程序抛出了 OutOfMemoryError:无法创建新的 native 线程
。
我用jvm参数-Xmx24m
重试了实验。在这种情况下,当 i 约为 24K 时,客户机器上的程序会抛出相同的错误。如果我使用 -Xss
将线程的堆栈跟踪减少到 128K,也会有一个小的增量。
当线程终止时,客户的机器似乎没有释放线程的堆栈。
有人遇到过这个问题吗?有任何想法吗?
最佳答案
您依赖于线程启动和随后终止的速度的微小细节。在一台机器上,线程生成过程会超出线程死亡过程,而在另一台机器上,则恰好相反。您的计数器仅跟踪创建的线程总数,而不是任何时间点存在的净线程数。
要点:您的测试代码无助于证明有关运行时的任何重要信息。
关于java - 线程终止时jvm是否释放线程的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072067/