2010-12-16 2 views
1

내 프로그램에서 여러 개의 Swingworker 스레드를 사용하며 완료 후 각 스레드의 메모리를 비워야합니다. 내 스레드가 doInBackground() 메소드를 완료하여 종료하는지 또는 cancel()에 의해 중지되는지 여부에 상관없이 스레드 자체는 거기에 머물러 있습니다 (여전히 Jconsole에 표시됨).Swingworker가 할당 한 메모리를 확보하는 방법은 무엇입니까?

Swingworker 인스턴스를 역 참조하고 강제로 가비지 수집을 수행하지만 Java 프로세스는 메모리를 해제하지 않습니다 (예 : Windows 작업 관리자에서 볼 수 있음).

어떻게 종료 된 Swingworker 스레드를 완전히 제거 할 수 있습니까?

또는 복잡한 처리 중에 여러 곳에서 할당하는 메모리를 어떻게 확보 할 수 있습니까?

모든 조언을 가장 중요하게 생각합니다. 감사.

답변

1

아마도 아무 것도 할 필요가 없으며 원하는대로 코드가 이미 작동하고있을 것입니다. Teh 스레드는 스레드 풀의 일부이기 때문에 여전히 거기에 있지만, SwingWorker 객체가 사용하는 메모리가 해제되지는 않습니다.

자바 과정은 결코 (예를 들어, Windows 작업 관리자에 의해 도시 된 바와 같이) 어떤 메모리 를 해제하지 않습니다.

JVM (일반적으로 Sun/Oracle 하나)은 일반적으로 OS에 메모리를 반환하는 것을 매우 꺼리고, 힙 메모리의 70 % 이상을 사용하지 않는 경우에만 수행합니다. This can be tuned 명령 줄 옵션을 사용하여 -XX:MaxHeapFreeRatio을 사용합니다 (일반적으로 그대로 두어야합니다).

프로그램의 메모리 사용량을 진단하려면 사용 된 힙 메모리와 사용 가능한 힙 메모리를 표시 할 수있는 VisualVM과 같은 도구를 사용하는 것이 훨씬 더 유용합니다. 나는 JConsole을 잘 모르지만 그 기능을 가지고 있다고 기대할 것이다.

+0

Okay , 고맙습니다. JVM이 메모리를 운영체제로 되돌리기를 꺼린다는 성명서는 상황에 대한 올바른 설명이다. 그리고 예, JConsole은 가비지 콜렉션을 강제 실행할 때 힙 메모리가 리턴됨을 보여줍니다. – Lulach

0

비슷한 문제가 있습니다. 여러 SwingWorker 스레드를 사용하여 일부 계산을 수행하고 Windows 작업 관리자는 java.exe의 스레드 수가 결코 늘지 않는다고보고합니다. 작업이 정상적으로 완료되었거나 취소 된 것이 전혀 문제되지 않는 것 같습니다.

현재 스레드 수는 컴퓨터의 RAM 크기와 프로세스에서 사용할 수있는 최대 주소 공간 (32 비트 운영 체제에서는 2GB 임)에 따라 다릅니다.

내가 아는 바로는 때로는 이것 만이 유일한 한계가 아닙니다. Windows (XP 또는 이후)에서는 제한이 OS에 명시 적으로 부과되지는 않았지만 1000 개가 넘는 스레드가있는 프로세스는 분명한 이유없이 충돌하는 경향이 있다고 들었습니다.

숫자가 매우 클 때까지 SwingWorker 스레드를 시작하고 취소하기 위해 프로그램을 사용하려고합니다. 나는 무엇이 일어날 지 매우 궁금하다 (나는 XP 32 bit와 1 GB RAM을 가지고있다).

문제는 실제 문제 일 수 있습니다. 일부 운영 체제 및/또는 하드웨어 플랫폼에서 스레드 카운트 문제가있는 경우 매우 오랜 기간 동안 (시간 종료가 아닌) 이러한 프로그램을 사용하는 누군가는 매우 나쁜 경험을 할 수 있습니다.

관련 문제