【发布时间】:2014-10-31 15:21:51
【问题描述】:
我有一个大量创建线程的应用程序。结果我得到一个 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。
【问题讨论】:
-
我不是这里的专家,但我觉得你在比较苹果和橘子,这行:
.maxMemory() - untime.getRuntime().totalMemory(),maxMemory 和 totalMemory 对我来说听起来不同 -
为什么要创建大量线程?
-
@Coffee 这应该是 JVM 可以分配的内存,当我只使用 freeMemory() 时,它会在创建第一个线程之前阻塞。
-
一个“大量创建线程”的应用程序对我来说听起来有点吓人。如您所见,创建线程的成本很高,这就是存在线程池的原因。您正在创建多少个线程?如果您正在创建如此多的线程,那么您会造成内存压力,这是一个严重的问题。我建议您退后一步,重新考虑您的解决方案。 《Java Concurrency in Practice》一书在这里是一个很好的资源。
-
@DavidSchwartz,当线程刚开始流行时,多处理器计算机在大学研究部门之外并不存在。发明线程是为了组织必须等待许多不同异步输入的程序(尤其是实时嵌入式程序)的一种方式。程序不会有一个大的事件循环来轮询每个不同的可能输入,而是有一个线程来等待每个不同的输入源。
标签: java multithreading out-of-memory