본문 바로가기

네트워크 프로그래밍/Thread

[박혜웅] Java Default Threads in Java VisualVM

<설명이 틀릴 수 있으므로, 자세한 내용은 페이지 하단의 참조 URL에서 확인하기 바랍니다.>


<Java VisualVM 화면>

Java VisualVM은 JConsole처럼 JMX를 이용하여 Java Process를 모니터링할 때 매우 유용한 도구이다.
위 그림은 main()안에서 
스레드(myThread)를 1개 실행하고, Thread.join()하여 스레드(myThread)가 종료될 때까지 main 스레드를 기다리게 했을 경우에 대한 Java VisualVM 화면이다.
왼쪽은 원격 서버에서 Java 프로그램을 실행한 경우이며, 오른쪽은 내 컴퓨터(로컬)에서 Eclipse로 실행한 경우이다.
원격에서 실행할 경우 아래처럼 JMX옵션을 주어야 하며, 아래의 경우 인증없고, SSL사용안하고 6789포트로 JMX를 설정했다.
java
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6789
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false -jar SimpleThreadTest.jar

우선 main, myThread는 직접 작성한 소스코드의 사용자 스레드이다.
나머지는 JVM에서 자동적으로 실행한 스레드들이며, 기능은 아래와 같다.

DestroyJavaVM
프로그램/스레드 종료(program exit)후에, JavaVM을 unload하는 스레드이다.
예를 들어 스레드를 생성 후, main스레드가 종료되었을 때, 
DestroyJavaVM 스레드가 실행되어 확인할 수 있다.
또한 
Dead Lock을 발생시킬 경우에도, DestroyJavaVM 스레드가 실행되어 확인할 수 있다.
 

Signal dispatcher
OS가 JVM에 보낸 signal을 처리하는 스레드이다.

RMI TCP Accept/Connection
RMI Scheduler
JMX server connection timeout
위 스레드들은 모두 JMX와 관련된 것으로 보인다.
"
JMX server connection timeout" 뒤의 숫자는 접속 VisualVM과 같은 툴로 JMX서버에 접속할 때마다 증가한다. 

Reference Handler
finalize()를 오버로드한 클래스를 finalizable objects라고 부르는데, Garbage Collector가 이런 객체들을 발견할 경우 바로 메모리해제를 하는 대신에 finalization process를 위한 특별한 queue에 추가합니다.
Reference Handler 스레드는 이런 enqueuing 작업을 한다.
 
 
Finalizer
finalization queue에서 객체(objects) 목록을 가져와서 finalize() 메소드를 호출해 주는 스레드이다.
finalize()를 모두 수행한 후, 이 객체를 Garbage Collector에게 알려주어 메모리를 해제하도록 한다.
따라서, Finalizer 스레드는 Reference Handler 스레드와 함께 동작한다.

Attach Listener 실행중인 Java 프로세스에 접근(attach)하여 JVM으로 부터 시스템속성(system properties)을 얻기 위한 스레드이다. 
OS에 의존적으로 동작하여, Windows의 경우 스레드를 생성해서 JVM과 통신하며, Linux/Solaris는 Unix domain socket을 생성하여 통신한다. 위 그림에서 Windows에서만 이 스레드가 표시되는 것도 이런 이유이다.


public class SimpleThreadTest implements Runnable {
	public void run() {
		Thread.currentThread().setName("myThread");
		while (true)
			;
	}

	public static void main(String[] args) {
		Thread thread = new Thread(new SimpleThreadTest());
		thread.start();
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

참고 URL
http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation.html
http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2009-05/msg00038.html
http://jinwoohwang.sys-con.com/node/995699/mobile
http://stackoverflow.com/questions/7658670/understanding-the-reference-handler-thread
http://whaleboy.tistory.com/53
http://openjdk.java.net/groups/hotspot/docs/Serviceability.html#tmanagement