Java 线程内存爆炸

原文 标签 java multithreading memory

我对并发编程相当陌生,我正在学习它。

我正在 Java JDK 7(Fork Join API)中实现快速排序来对对象列表(100K)进行排序。

在不使用并发的情况下使用这段递归代码时,我没有观察到内存爆炸,一切都很好。

我刚刚添加了在多核上使用它的代码(通过扩展类 RecursiveAction),然后内存使用量非常高,直到达到极限。通过做一些分析,我观察到线程的高创建率,我认为这是可以预期的。
但是,Java 线程本身是否需要更多内存,还是我在这里遗漏了什么?

快速排序必须需要很多线程,但不会比普通对象多。

当我达到阈值时,我是否应该停止创建 RecursiveAction 线程,然后切换到一段连续的代码(不再有线程)?

非常感谢。

最佳答案

默认情况下,Java 线程通常单独占用 256k/512k(取决于操作系统、jdk 版本..)的堆栈空间。

如果在 CPU 密集型进程(例如快速排序)中运行的线程数多于处理器/内核数,那么您将浪费大量资源和速度,因此请尽量不要运行多于内核数的线程。

关于Java 线程内存爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251035/

相关文章:

java - Jersey -使用Jackson生产JSON字符串

java - 在ArrayList中找到最近的元素

java - 如何将要同步的电子邮件ID传递到android中的创建事件日历中?

python - 在 Python 中使用多线程

c# - 如何在不轮询 ThreadState 的情况下判断线程是否已完成执行?

java - 如何使用 map 节省空间

C 内存映射

java - 创建滑动 fragment 以进行应用介绍

c++ - 编码和等待多个相互依赖的线程的算法、模式或最佳实践?

linux - 如何计算进程中可用的 "Max Contiguous Free Space"?