【问题标题】:java threading memory management issuesjava线程内存管理问题
【发布时间】:2010-12-06 07:54:10
【问题描述】:
我现在正在开发一个程序,基本上是这样的:有一个 4 路停车,汽车随机到达每条道路。每条道路都由 FCFS 提供服务,交叉口采用循环管理方式,一次有 1 辆车通过。每辆等待的车都是一个线程。我已经让线程同步和算法工作没有问题。我不太清楚的问题是如何防止错误:OutOfMemoryError:无法创建新的本机线程。我意识到这是由于堆(堆栈?我总是让它们切换)变满了。我想不出一种方法来确保垃圾收集器正确管理已执行的线程并且在执行后不会在内存中逗留。我尝试使用软引用设置我的队列(每条“道路”与汽车线程)并将任何硬引用归零但无济于事。这里有人有这方面的经验吗!?谢谢!!!
【问题讨论】:
标签:
java
multithreading
memory-management
【解决方案1】:
"OutOfMemoryError: unable to create new native thread" 不指的是堆内存。它不会帮助您清空引用或使用软/弱引用。此外,增加堆大小只会让事情变得更糟。
Java 将本机内存用于线程堆栈。每次启动线程时,都会在 JVM 堆之外分配一个新堆栈。直到线程终止,堆栈才会被释放。考虑使用更少的并发线程(例如,您可以通过使用 ThreadPoolExecutor 来控制数量),或者可能减少堆栈大小(使用 -Xss{size}k)
另请参阅this post,其中详细介绍了许多类型的内存不足错误。
【解决方案2】:
您是否尝试过使用ThreadPool?
从 Java 5 开始,您可以创建一个 ThreadPool,您可以在其中决定 Vm 应该为您的算法初始化多少线程。线程被创建和重用。
我遇到了类似的问题。线程不会被 GarbageCollector 删除/移除,并且以某种方式永远存在。
【解决方案3】:
只有在运行线程过多时才会发生这种情况。 (不仅仅是对线程的引用)像 @Markus 一样,我建议您切换到像 ExecutionService 这样的线程池,因为它将管理线程的创建并且它可以工作。
顺便说一句:并发库可以追溯到 1998 年,但仅包含在 Java 5.0 (2005) 中,因此如果您必须拥有旧版本,则可以使用向后移植或原始库。