Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java需要新线程的内存_Java_Multithreading_Out Of Memory - Fatal编程技术网

Java需要新线程的内存

Java需要新线程的内存,java,multithreading,out-of-memory,Java,Multithreading,Out Of Memory,我有一个大量创建线程的应用程序。结果我得到了一个OutOfMemoryError。我的想法是等到有足够的可用空间来创建下一个线程。但因此,我需要知道创建一个线程需要多少内存,以及这个内存量是否可用。有没有办法获得线程所需的内存量?我怎样才能确定这个内存量是否可用 我已经尝试过的: for (int i = 0; i < links.size(); i++) { while(Runtime.getRuntime().maxMemory() - Runtime.getRuntime()

我有一个大量创建线程的应用程序。结果我得到了一个OutOfMemoryError。我的想法是等到有足够的可用空间来创建下一个线程。但因此,我需要知道创建一个线程需要多少内存,以及这个内存量是否可用。有没有办法获得线程所需的内存量?我怎样才能确定这个内存量是否可用

我已经尝试过的:

for (int i = 0; i < links.size(); i++) {
    while(Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory() +
        Runtime.getRuntime().freeMemory() < MEMORY_THRESHOLD) {
        synchronized (lock) {
            lock.wait(10);
        }
    }
    Thread t = new Thread(new Task(links.get(i)));
    t.setDaemon(true);
    t.start();
}
for(int i=0;i

但是,即使我使用100MB作为阈值,我也会得到一个OutOfMemoryError

否,您可以删除此代码并使用
线程池来代替。你想做的事情很难,你应该使用更高的抽象,你必须做多线程,否则你根本不做

执行者,目前他们是更高的抽象。
如果您的任务是计算绑定的,那么Java 7中的
ForkJoin
就是您的朋友,只要您知道如何递归地将问题划分为子问题,就不必担心池的大小

关于这个问题没有足够的信息来建议最佳解决方案

通常,当您有昂贵的I/O操作时,您可能需要创建比实际CPU内核多得多的线程。从
links
变量判断,这可能是其中一种情况,但正如其他人所建议的那样,创建太多线程通常意味着设计不好。它甚至可能使您的系统耗尽可用资源

即使在通过网络时,您的带宽也是固定的,因此,除非您可以直接访问internet主干网,否则您不太可能获得任何性能优势,因为大多数网站都应该以高速响应

话虽如此,即使您减慢了线程的创建速度,您也无法控制线程将消耗多少内存以及在什么时候消耗。i、 e.您的所有线程可能同时开始下载数据,即使您不创建任何新的线程,您仍然会耗尽内存

总之,请遵循其他用户的建议:

  • 使用执行器服务
  • 阅读更多关于线程的内容(实际上,Java并发是一个非常好的源代码)
  • 想想为什么要创建这么多线程?为什么你期望无论你做什么都能更快
    另外,如果您在问题中包括为什么需要创建这么多线程,也会有所帮助

    我在这里不是专家,但我觉得您在用以下行比较苹果和桔子:
    .maxMemory()-untime.getRuntime().totalMemory()
    ,maxMemory和totalMemory听起来不一样为什么要创建大量线程?@Coffee这应该是JVM可以分配的内存,当我使用freeMemory()时,它会在创建第一个线程之前阻塞。一个“大量创建线程”的应用程序听起来有点吓人。正如您所发现的,创建线程非常昂贵,这就是线程池存在的原因。您正在创建多少线程?如果创建的线程太多,导致内存压力,这是一个严重的问题。我建议你退后一步,重新考虑你的解决方案。“实践中的Java并发”这本书在这里是一个很好的资源。@DavidSchwartz,当线程第一次流行时,大学研究部门之外不存在多处理器计算机。线程被发明为一种组织程序(特别是实时嵌入式程序)的方法,该程序必须等待许多不同的异步输入。该程序将有一个线程等待每个不同的输入源,而不是为每个不同的可能输入轮询一个大事件循环。您的解决方案可行,但我仍然不知道我可以创建多少个线程。Executors.newFixedThreadPool()询问我线程的最大数量,但这正是我所不知道的。@kaetzacoatl介于cpu内核数量和两倍之间,更多的线程会导致性能不必要地降低。如果有成吨的线程整天都在等待,请使用异步框架。