当前位置: 首页 > 知识库问答 >
问题:

为什么我的代码会创建很多线程(java.lang.OutOfMemoryError:无法创建新的本机线程)

海典
2023-03-14

我试图通过拆分列表来检查元素是否在字符串中:

`公共类ParallelSearchComment扩展了RecursiveTask{private static final long serialVersionUID=1L;

int lo; 
int hi; 
String com;
String query;
int T;

ParallelSearchComment(String c, int l, int h, String q, int Treshold){
    com=c;
    lo=l;
    hi=h;
    query=q;
    T=Treshold;
}

private int findMiddle(String text){ // Only split at whitespace chars (or some words would be missed) 

    int middle = lo + ((hi - lo)/2);
    int i= middle;                                                            
    for (i = middle; i != hi && com.charAt(middle) != ' ' && i-middle <= query.length()+1; i++){

    }  
    middle = i;
    return middle;
}

@Override
protected Boolean compute() {
    int middle = findMiddle(com);
    if (hi - lo < T || hi-middle <= query.length()) {//hi-middle <= query.length()
        return com.substring(lo, hi).contains(query);
    } else {

        ParallelSearchComment left = new ParallelSearchComment(com, lo, middle, query, T);
        ParallelSearchComment right = new ParallelSearchComment(com, middle, hi, query, T);

        left.fork();
        boolean resRight = right.compute();
        boolean resLeft = left.join();

        return resRight || resLeft;
    }

}

static boolean ParallelSearchComment(String c, String query, int T,int p) {
    final ForkJoinPool fjPool = new ForkJoinPool(p);
    ParallelSearchComment t = new ParallelSearchComment(c, 0, c.length(), query, T);
    return fjPool.invoke(t);
}

`

共有2个答案

邓星光
2023-03-14

由于您的代码段没有显示如何调用静态布尔值ParallelSearchComment,我将假设它被用于初始化搜索。另外,我将假设您只从您的main中触发了一次搜索。

这样,您传递的并行性值(或p)很可能高于当前JVM堆所能处理的值。看看当你把它减少到5或10时会发生什么。

易飞文
2023-03-14

问题是,每次调用ParallelSearchComment时,您都在创建一个新的ForkJoinpool实例。相反,您应该创建一个ForkJoinPool并在整个应用程序中使用。

 类似资料:
  • 问题内容: 我看到这样的评论 我见过这个问题的一个地方是,如果您继续创建线程,而不是直接在线程对象上调用run(),而不是调用start()。这将导致线程对象不被取消引用…因此,一段时间后,出现无法创建新本机线程的消息 在Sun Java论坛上 在我的应用程序中,最初我们计划使用线程,但是后来,我们决定不再需要线程,因此我们只调用run()而不是start()。我们是否需要为新的threadCla

  • 我试图在(1and1VPS)上运行服务器。就在服务器启动和客户机的几个请求(重新加载网页)之后,我得到了这个错误: 但是当我在计算机上运行时,一切都正常。我使用和Centos5.8新安装制作了自己的虚拟服务器,它也在那里工作。 这个内存不足错误的原因可能是什么?如果你有任何建议,请分享。我不知道该怎么处理这个了。

  • 它的发生是因为我创建了许多线程,而没有关闭它们?还是经常创造新的? 有人能告诉我在代码中是否做错了什么吗?

  • 运行5-6小时后,我从spark-driver程序中得到以下错误。我正在使用Ubuntu16.04LTS和Open-JDK-8。 cat/proc/sys/kernel/threads-max “无法创建新的本机线程”显然意味着它与堆无关。所以我相信这更多的是一个操作系统的问题。

  • 我目前正在安装一台新的MongoDB ops manager机器。安装工作正常,但我无法启动mongodb彩信服务。实例0的启动因java而失败。lang.OutOfMemoryError异常。我使用与测试服务器上相同的配置(2个CPU核,8gb ram),在那里服务启动时没有任何中断。更改ulimit配置/使用root用户启动服务无效。 新服务器规格: 2.0Ghz的10个Vcore 48gb内