我现在正在开发一个程序,其本质是这样的:有一个 4 路停靠点,汽车随机到达每条路。每条道路均采用 FCFS 服务,交叉路口采用循环方式管理,每次 1 辆车通过。每辆等待的汽车都是一个线程。我已经让线程同步和算法工作没有问题。我不太明白的问题是如何防止错误:OutOfMemoryError:无法创建新的 native 线程。我意识到这是由于堆(堆栈?我总是让它们切换)变满。我无法找到一种方法来确保已执行的线程由垃圾收集器正确管理,并且在执行后不会在内存中徘徊。我尝试使用软引用设置我的队列(带有汽车线程的每条“道路”),并清空任何硬引用,但无济于事。这里有人有这方面的经验吗!谢谢!!!
最佳答案
“OutOfMemoryError:无法创建新的 native 线程”不是指的是堆内存。它不会帮助您清空引用或使用软/弱引用。此外,增加堆大小只会让事情变得更糟。
Java 使用 native 内存作为线程堆栈。每次启动一个线程时,都会在 JVM 堆之外分配一个新的堆栈。直到线程终止时才会释放堆栈。考虑使用较少的并发线程(例如,您可以使用 ThreadPoolExecutor 来控制数量),或者减少堆栈大小(使用 -Xss{size}k)
另请参阅this post ,其中详细介绍了多种类型的内存不足错误。
关于java线程内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4364270/