Java线程内存爆炸

标签 java multithreading memory

我对并发编程还很陌生,我正在学习它。

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

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

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

Quicksort 必须需要很多线程,但不会比常规对象多。

我是否应该在达到阈值时停止创建 RecursiveAction 线程,然后切换到顺序代码段(不再有线程)?

非常感谢。

最佳答案

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

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

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

相关文章:

java - 具有执行器框架的多个任务

c++ - 限制用于 mmap 的缓冲区缓存

java - 为大尺寸图像生成固定尺寸缩略图的有效方法?

c - Linux C 程序 : where did this SIGABRT come from?

c# - 使用 ReactiveUI、Observables、SubscribeOn 和 ObserveOn 在长时间运行的过程中在 UI 中显示输出日志

java - 我可以在不请求该 JVM 的情况下从另一个 JVM 的内存访问对象吗?

c++ - Valgrind 错误读取大小为 4 无效

java - 从 Java 中的数组构建树结构(用于目录)

java - 如何在没有前缀的情况下从嵌入式 groovy 调用 Java 方法并访问属性

java - 在java中获取eth0接口(interface)的IP地址只返回IPv6地址而不是IPv4