Java需要新线程的内存
我有一个大规模创建线程的应用程序。 结果我得到一个OutOfMemoryError 。 我的想法是等到有足够的可用空间来创建下一个Thread 。 但是因此我需要知道创建一个线程需要多少内存以及这个内存是否可用。 有没有办法获得线程需要的内存量? 如何确定此内存量是否可用?
我已经尝试过的:
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(); }
但即使我使用100MB作为阈值,我也会得到一个OutOfMemoryError 。
不,您去删除此代码并改为使用ThreadPool
。 你想要做的是非常困难,你应该使用更高的抽象来做multithreading,或者你根本不做。
检查 Executors,目前它们是更高的抽象。 如果您的任务是计算绑定的,那么Java 7中的ForkJoin
就是您的朋友,只要您知道如何将问题递归地划分为子问题,您就不需要为池大小而烦恼。
关于该问题的信息不足以提出最佳解决方案。
通常,在进行昂贵的I / O操作时,可能需要创建比实际CPU内核多得多的线程。 从links
变量判断,这可能是其中一种情况,但正如其他人建议创建太multithreading通常表明设计不好。 它甚至可能使您的系统耗尽可用资源。
即使通过网络,您的带宽也是固定的,因此除非您可以直接访问互联网骨干网,否则您不太可能获得任何性能优势,因为大多数网站都应该高速响应。
话虽如此,即使您减慢了线程创建速度,您也无法控制线程将消耗多少内存以及在什么时间消耗。 即你的所有线程可能会同时开始下载数据,即使你没有创建任何新的线程,你仍然会耗尽内存。
总之,请按照其他用户的建议:
- 使用
ExecutorService
- 阅读更多关于Threads(Java Concurrency在实践中,是一个非常好的来源)
- 想想你为什么要创建这么multithreading? 你为什么期望无论你做什么都会更快?
PS。 如果您包含为什么需要在问题中创建这么multithreading,这也会有所帮助