我对并发编程相当陌生,我正在学习它。
我正在 Java JDK 7(Fork Join API)中实现快速排序来对对象列表(100K)进行排序。
在不使用并发的情况下使用这段递归代码时,我没有观察到内存爆炸,一切都很好。
我刚刚添加了在多核上使用它的代码(通过扩展类 RecursiveAction),然后内存使用量非常高,直到达到极限。通过做一些分析,我观察到线程的高创建率,我认为这是可以预期的。
但是,Java 线程本身是否需要更多内存,还是我在这里遗漏了什么?
快速排序必须需要很多线程,但不会比普通对象多。
当我达到阈值时,我是否应该停止创建 RecursiveAction 线程,然后切换到一段连续的代码(不再有线程)?
非常感谢。
最佳答案
默认情况下,Java 线程通常单独占用 256k/512k(取决于操作系统、jdk 版本..)的堆栈空间。
如果在 CPU 密集型进程(例如快速排序)中运行的线程数多于处理器/内核数,那么您将浪费大量资源和速度,因此请尽量不要运行多于内核数的线程。
关于Java 线程内存爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251035/