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