Java需要新线程的内存

kae*_*atl 2 java multithreading out-of-memory

我有一个大规模创建线程的应用程序.结果我得到一个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();
}
Run Code Online (Sandbox Code Playgroud)

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

Sle*_*idi 6

不,您去删除此代码并使用ThreadPool替代.你想要做的是非常困难,你应该使用更高的抽象来做多线程,或者你根本不做.

检查 Executors,目前它们是更高的抽象.如果您的任务是计算绑定的,那么ForkJoin在Java 7中您就是您的朋友,只要您知道如何递归地将问题划分为子问题,您就不需要为池大小而烦恼.

  • @kaetzacoatl介于cpu核心数量和两倍之间,更多且性能不必要地降低.如果你有大量的线程整天等待使用异步框架. (3认同)