2009-07-02 11 views
0

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가 발생합니다.

도와 주시겠습니까?

감사는 루프가 종료되지 않는 이유를 알려 불가능) (doSomeStuff의 내부에 무슨 일이 일어나고 있는지 보지 않고

+0

1. invokeThread() 및 dispose()가 클래스의 동일한 인스턴스에서 호출되는지 확인하십시오. 2. 무슨 일이 일어나고 있는지 더 정확한 그림을 얻기 위해 코드에 몇 가지 로깅을 시도 했습니까? –

+0

@quant_dev 1- 아니, 잘 모르겠지만 그렇게 생각합니다. dispose()가 호출됩니다. 2 - 몇 가지 로깅을 넣고 좀 더 정확한 그림을 얻으려고합니다. –

답변

3

시도가 :

이 스레드는 항상 변수의 마스터 복사본을 사용하도록하기위한 것입니다
private volatile boolean running = false; 

, 로컬에 저장되지 않습니다.

+0

변수의 마스터 복사본은 무엇입니까? –

+0

글쎄, 변수가 현재 스레드 내에서만 수정된다고 가정하는 몇 가지 최적화가 있습니다. 이것은 실제 변수가 아닌 스레드에서 사본을 사용하고 실수 변수 (master-copy)를 수시로 갱신 할 수있게합니다. 그러나 플래그 변수는 다른 코드에 의해 수정 될 수 있으므로이 변수를 휘발성으로 표시해야하며 스레드는 이러한 가능성을 고려해야한다는 것을 알게됩니다. – Malcolm

+0

놀라운 ... 작품! 덕분에 많이 –

0

. 분명히 루틴은 dispose()가 결국 호출되거나 실행이 결국 수동으로 false로 설정 될 것으로 예상하고 있습니다. 루프가 종료되지 않으면 이러한 상황이 발생하지 않습니다. 왜 doSomeStuff() 내의 논리를 검사하여 그 이유를 알아 내야합니다. 변수 running에 키워드 volatile를 추가

+0

dispose()가 호출되고 있습니다. inside doSomeStuff()는 문자열 조작 (메모리를 소비하는 문자열 조작)이며, 하나님이 무엇을 하는지를 아는 다른 메서드를 호출합니다. –

관련 문제