java线程内存管理问题

时间:2010-12-06 07:54:11

标签: java multithreading memory-management

我现在正在制定一项基本上是这样的计划:有一个4路停车,车辆随机时间到达每条道路。每条道路都为FCFS提供服务,交叉路口采用循环式管理,每次1个车道。每辆等候的车都是一个线程。我已经得到了线程同步和算法没有问题。我无法弄清楚的问题是如何防止错误:OutOfMemoryError:无法创建新的本机线程。我意识到这是由于堆(堆栈?我总是让它们切换)变满了。我无法找到一种方法来确保执行的线程由垃圾收集器正确管理,并且在执行后不会在内存中停留。我已经尝试设置我的队列(每个“道路”与汽车线程)与软引用和无效任何硬引用无济于事。这里的任何人都有这方面的经验!?致谢!!!

3 个答案:

答案 0 :(得分:2)

“OutOfMemoryError:无法创建新的本机线程”引用堆内存。它无法帮助您归零引用或使用软/弱引用。此外,增加堆大小只会使事情变得更糟。

Java将本机内存用于线程堆栈。每次启动线程时,都会在JVM堆外部分配新堆栈。在线程终止之前,不会释放堆栈。考虑使用较少的并发线程(例如,您可以通过使用ThreadPoolExecutor来控制数量),或者可以减少堆栈大小(使用-Xss {size} k)

另请参阅this post,其中详述了许多类型的内存不足错误。

答案 1 :(得分:0)

您是否尝试使用ThreadPool

您可以创建自Java 5以来的ThreadPool,您可以在其中决定Vm应为您的算法初始化的线程数。线程被创建并重用。

我有类似的问题。 GarbageCollector不会删除/删除线程,并以某种方式永远存在。

答案 2 :(得分:0)

只有在运行线程太多时才会发生这种情况。 (不只是对线程的引用)像@Markus一样,我建议你切换到像ExecutionService这样的ThreadPool,因为它将管理线程的创建并且它可以工作。

BTW:并发库可以追溯到1998年,但只包含在Java 5.0(2005)中,所以如果你必须有旧版本,你可以使用backport或原始库。