我在j2me应用程序中遇到内存问题。 (见another question)
我发现一个类有一个循环,在应用程序关闭之前不会停止。此循环占用了所有可用内存。
我没有上课,所以我不知道为什么这样做。所以欢迎任何建议。
以下是该类的简化版本:
import java.util.TimerTask;
public class SomeClass extends TimerTask implements Runnable {
private boolean running = false;
private Thread thread;
public void invokeThread() {
running = true;
thread = new Thread(this);
thread.start();
}
public void run() {
while(running) {
try {
Thread.sleep(800);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
doSomeStuff();
}
}
private void doSomeStuff() {
// do some stuff that consumes my memory
}
public void dispose() {
running = false;
}
}
另一个类调用SomeClass.invokeThread()并等待一些用户响应(这已经占用了一些内存)。
当用户结束输入数据时,另一个类调用dispose()并且while循环不会停止,等待几分钟或尝试导航更多的应用程序并得到一个OutOfMemoryError。
你能帮助我吗?
感谢
答案 0 :(得分:3)
尝试将关键字volatile
添加到变量running
:
private volatile boolean running = false;
这样做是为了确保您的线程始终使用变量的主副本,而不是本地存储的主副本。
答案 1 :(得分:0)
如果没有看到doSomeStuff()内部发生了什么,就无法确定为什么循环不会终止。显然,例程期望最终将调用dispose()或者最终手动将run设置为false。如果循环没有终止,那么这些事情都不会发生。您应该检查doSomeStuff()中的逻辑以找出原因。