2011-07-05 2 views
0

다른 웹 페이지를 가져 오는 다중 스레드 응용 프로그램이 있습니다. 이를 위해 스레드 간의 부모 자식 관계를 고안했습니다. 부모는 페이지에서 다른 URL을 가져 와서 새 스레드를 생성합니다. 이 스레드는 페이지가 변경 될 때까지 페이지를 계속 가져옵니다. 메인 스레드가 URL을 저장하는 문자열의 ArrayList를 가지고3 일 후 다중 스레드 응용 프로그램이 중지됩니다.

while(true){ 
    find_new_instances(...); 
    if we get any new, then 
     Thread.start(...); 
    Thread.sleep(120000); 
} 

너 한테

메인 스레드 주 스레드 조사 메인 페이지에서 변경 2 분마다 (어떤 변화가있을 경우는 새로운 스레드를 생성) 새로운 스레드가 생성되는 각각의 나는 쓰레드가 쓰기를 위해 불변 객체만을 사용해야한다고 들었다. 여기에 변경 목록을 사용하면 문제가 발생합니까? 하위 스레드에서 페이지 가져 오기 및 데이터베이스 삽입과 같은 작업이 수행됩니다.

그러나 응용 프로그램은 메모리 요구 사항을 점차 증가시켜 최종적으로 데드락/굶주림을 고정 상태 또는 OutOfMemory로 만듭니다. 스레드 수가 너무 큽니다. 나는 무엇이든을 시험해 보는 것에 손실이다. 유사한 문제가 발생했다면 친절하게 제안하십시오.

+0

스레드 수는 얼마나됩니까? 이 루프는 아주 짧은 시간에 많은 스레드를 생성하고 각각의 스레드를 아주 오랫동안 잠자기 상태로 만듭니다. 나에게별로 의미가 없다 ... – Random

+0

@Random : 스레드 수가 약 50 개입니다. (다른 스레드가 생성되어 소멸됩니다) – Sumit

+0

@nos : 스레드간에 데이터 공유가 이루어지지 않고 상위/마스터 스레드 만 실행중인 스레드의 수를 유지합니다. – Sumit

답변

1

나는 비슷한 유형을 직면하면

+0

저는 현재 풀링을 사용하고 있지 않지만 그것을 시도 할 것입니다. 또한 스레드를 직접 중지하거나 잠자 게하고 작업이 끝날 때까지 반복적으로 계속해야합니까? 데이터가 데이터베이스에 저장되고 있습니다 (별개로 테스트되었으므로 문제가되지 않습니다). – Sumit

+0

앞서 말했듯이 스레드 풀을 사용하면 메모리 누수가 발생하지 않을 가능성은 매우 낮지 만 모두 똑같은 좋은 아이디어입니다 . –

0

메모리 누수가 있습니다. 메모리가 부족할 때 힙 덤프를 가져 와서 누출 위치를 확인하는 것이 좋습니다.

당신이 옵션을 사용할 수 있습니다, 자동으로 힙 덤프를 트리거하려면

-XX:+HeapDumpOnOutOfMemoryError 

아마도

-XX:HeapDumpPath=/path/to/heap/dumps 

는 작업자 스레드 풀을 원한다면, 당신은 심지어 ExecutorService를 또는를 사용하는 것이 좋습니다 ScheduledExecutorService를 사용하여 일정한 간격으로 작업을 수행 할 수 있습니다. 내가 바로 그때 문제를 이해하면 GC()를 null로 이전 스레드 값을 설정하고 예비 성형에 의해에서 OutOfMemory 오류를 bypasse 수

1

(그러나이 문제가 당신에게 수 없을 수도 있습니다) 내가 GUI 기반 응용 프로그램을 개발하는 동안 문제가 발생했습니다.

  • 는 스레드 풀을 만들기 충돌의

    이유. 응용 프로그램에서 사용 가능한 스레드를 사용하십시오. 당신은 당신이 새로운 객체를 생성 (또는 문자열) 가능은 동일한 개체 이 값을 할당 할 경우 데이터를 저장하는 일 수도 있습니다 응용 프로그램

  • 에 충돌의 원인이됩니다 무한 스레드 를 만들 수 없습니다. 데이터가 길면 파일이나 데이터베이스에 저장할 수 있습니다. 항상 데이터를 보유하는 대신
+0

프로파일 링 후, 메모리 문제가 있지만 여전히 메모리 요구 사항이 계속 증가합니다 (처음에는 20MB에서부터 하루가 지나면 ~ 250MB). – Sumit

+0

사용되는 메모리가 계속 확장되면 리소스 누출, 메모리, 스레드, 핸들 등이 남아 있습니다. 당신이 그것으로 끝나면 할당되고 결코 처리되지 않습니다. –

+0

메모리가 어디에 있는지에 따라 크게 달라집니다. 메모리가 단기 또는 장기 힙 저장소에 저장되어 있습니까? 아니면 퍼미션 gen에 저장되고 있습니까? -Xmx를 사용하여 256MB 또는 그 밖의 많은 수를 말하는 경우에는 과도한 가비지 콜렉션을 수행하지 않고 자주 증가하므로 사용 된 많은 메모리가 휴지통이 될 수 있습니다. – Joseph

관련 문제