【发布时间】:2014-06-14 12:39:28
【问题描述】:
我第一次使用 Java 中的线程进行编程,所以这里有一个关于线程的初学者问题。
我的代码:
import java.util.ArrayList;
import java.util.List;
public class CollatzRunner implements Runnable {
private int lastNumber = 0;
private int highestCounter = 0;
private int highestValue = 0;
public void run() {
while(this.lastNumber < 1000000) {
this.lastNumber++;
Collatz c = new Collatz(lastNumber);
List<Integer> values = new ArrayList<Integer>();
while(c.hasNext()) {
values.add(c.next());
}
if(this.highestCounter < values.size()) {
this.highestCounter = values.size();
this.highestValue = values.get(0);
}
//System.out.println(Thread.currentThread().getName() + ": " + this.lastNumber);
System.out.println(Thread.currentThread().getName());
}
}
}
和:
public class CollatzSimulator {
public static void main(String[] args) {
CollatzRunner runner = new CollatzRunner();
Thread t1 = new Thread(runner, "Thread-1");
Thread t2 = new Thread(runner, "Thread-2");
Thread t3 = new Thread(runner, "Thread-3");
Thread t4 = new Thread(runner, "Thread-4");
//Thread t5 = new Thread(runner, "Thread-5");
//Thread t6 = new Thread(runner, "Thread-6");
//Thread t7 = new Thread(runner, "Thread-7");
//Thread t8 = new Thread(runner, "Thread-8");
t1.start();
t2.start();
t3.start();
t4.start();
//t5.start();
//t6.start();
//t7.start();
//t8.start();
System.out.println("bla");
}
}
运行此代码时,如果几乎立即得到 OutOfMemoryError: Heap space。所以我怀疑我在这里遇到了相当大的内存泄漏。问题是我在这个领域没有经验,所以我在这个网站上问。
到目前为止我已经尝试过: - 做了一个堆空间转储文件(在 5 秒内生成 800MB) - 在使用 Collatz 实例终止引用后尝试将其设置为 null,希望垃圾收集器能够释放堆空间。
我的程序只是一个小类 Collatz,它为给定数字生成 collatzsequence,我想使用线程为 0
感谢您的帮助!
【问题讨论】:
-
你到底为什么要制作 1000000 个 Collatz 对象?当然会崩溃,哈哈。
-
你试过只用一个
Thread来运行这个吗?我很确定它无论如何都会崩溃,并且崩溃不是由线程问题引起的(尽管此代码会在竞争条件方面存在问题) -
@Zhuinden:因为我们的任务是写一个类,可以计算给定数的collatz序列,我需要通过线程计算所有collatz序列,最多1mio。
-
@aRestless:是的,我们已经尝试过了。它会根据您本地计算机上的堆空间崩溃。在我们的笔记本电脑上,它开始在大约 150.000 个对象处崩溃。
-
你不能只创建一个 Collatz 对象吗?
标签: java multithreading out-of-memory