java - 线程终止时jvm是否释放线程的堆栈

标签 java multithreading exception garbage-collection out-of-memory

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

int i=0;
while(true)
{
  new Thread().start();
  i++;
}

两台机器都有windows 7jdk 7 32bits

在我的机器上,当 i 约为 3M 时,我终止了该进程。在客户的机器上,当 i 约为 8K 时,程序抛出了 OutOfMemoryError:无法创建新的 native 线程

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

当线程终止时,客户的机器似乎没有释放线程的堆栈。

有人遇到过这个问题吗?有任何想法吗?

最佳答案

您依赖于线程启动和随后终止的速度的微小细节。在一台机器上,线程生成过程会超出线程死亡过程,而在另一台机器上,则恰好相反。您的计数器仅跟踪创建的线程总数,而不是任何时间点存在的净线程数。

要点:您的测试代码无助于证明有关运行时的任何重要信息。

关于java - 线程终止时jvm是否释放线程的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072067/

相关文章:

java - jhipster-如何添加新角色

c++ - 有时只会出现 jni segv_accer 或 segv_mapper 错误

java - 错误 : “Thread-1” java. lang.IndexOutOfBoundsException

exception - iOS5:如何防止 rectForRowAtIndexPath 方法出现异常

java - 在catch block 中捕获异常

java - 模拟器 Oreo 和真实设备上的 INSTALL_FAILED_NO_MATCHING_ABIS

java - 在方法中更改类成员?

java - 出现错误 "type=Method Not Allowed, status=405"

java - Java中的线程安全全局变量

c++ - 我可以在一个类中将一个命名为lambda的函数作为变量,并尝试从主函数中调用该命名的lambda吗?