2010-12-06 152 views
1

我正在编写一个程序,现在基本上是这样的:在随机时间到达每条道路上的汽车有4路停车。每条道路都服务于FCFS,并且交叉路口管理为循环赛风格,每次有1辆车过境。每辆等车都是一条线。我已经获得线程同步和算法工作没有问题。我无法弄清楚的问题是如何防止错误:OutOfMemoryError:无法创建新的本地线程。我意识到这是由于堆(堆栈?我总是让它们切换)变满。我找不到一种方法来确保执行的线程由垃圾收集器正确管理,并且不会在执行后在内存中徘徊。我试着用软引用来设置我的队列(每条“汽车线程的道路”),并将任何硬引用归于无效。这里的任何人都有这方面的经验!?谢谢!!!java线程内存管理问题

+2

一些代码显示你如何处理胎面将不胜感激。 – 2010-12-06 07:57:45

回答

0

您是否试过使用ThreadPool

您可以从Java 5开始创建一个ThreadPool,其中您决定了Vm应为您初始化多少个线程算法。线程被创建并重用。

我有一个类似的问题。线程不会被GarbageCollector删除/删除,并以某种方式永远活着。

2

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

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

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

0

这只会发生,如果你有太多的运行线程。 (不只是线程的引用)像@Markus,我建议您切换到像ExecutionService一个线程池,因为它会管理线程的创建和它的作品。

BTW:并发库的历史可以追溯到1998年,但仅包含在Java 5.0中(2005年),所以如果你必须有一个旧版本,你可以使用的或者下行移植原始库。