개발 일기 시작

요즘 골프를 배우고 있습니다. 돈이 없어서 필드는 아직 못나가 봤지만 그래도 연습장에서 열심히 연습하고 있습니다. 골프를 배우면서 좋아진 것은 다양한 부류의 사람들을 만날 수 있다는 것입니다. 그리고 프로그램이 아닌 다른 분야에 흥미도 가지게 되어 좋습니다. 책도 프로그램 관련 책만 보다가 요즘은 골프 관련 책도 조금씩 보고 있습니다.
요즘 보고 있는 책은 골프 동호회에서 공동 구매한 "126타에서 70타까지" 라는 책입니다.

사용자 삽입 이미지
행정고시 합격해서 요즘 말하는 소위 꿈의 직장인 공무원 그것도 사무관으로 있다가 36세에 미국에서 골프 대학에 입학해서 골프의 실로 들어선 "박경호" 라는 분의 책입니다. 이 책은 자신이 골프 대학에서 입학하면서 겪었던 일들과 자신의 생각을 정리한 글의 모음집니다. 글을 읽다보니 나도 이런 글을 써보고 싶다는 생각이 들었습니다. 주제는 물론 골프가 아니겠죠... 당연히 소프트웨어, 프로그램, 개발자의 일상 등등...
이제 13년차에 들어서는 개발자의 개발일지를 시작합니다.

모든 소스가 공개되어 있는 JDK
오늘은 옆에 있는 후배로부터 JVM의 process id를 어떻게 가져오는지에 대한 질문을 받았습니다. 지금까지 알고 있는 방법은 프로세스가 수행될 때 프로세스 ID를 가져와서 특정 파일에 저장해 두는 방법뿐이었습니다. 주로 Weblogic등과 같은 데몬 프로세스를 startup하고 shutdown할 때 사용하는 방법입니다.
이 방법은 분명히 원하는 답이 아닐겁니다. 프로그램 내에서 자신의 process id를 가져오기를 원하는 겁니다. 일단 후배로 부터 RuntimeMXBan 인터페이스의 getName() 메소드의 출력 값이 process id의 값과 비슷하다는 힌트를 받았습니다. 하지만 자바 API를 보면 RuntimeMXBean의 getName()은 다음과 같이 정의되어 있어 각각의 JVM 구현체에 따라 틀려질 수 있습니다.

getName
String getName()Returns the name representing the running Java virtual machine. The returned name string can be any arbitrary string and a Java virtual machine implementation can choose to embed platform-specific useful information in the returned name string. Each running virtual machine could have a different name.

Returns:
the name representing the running Java virtual machine.


getName()에서 반환하는 값이 구체적으로 무엇인지 후배와 같이 확인해봤습니다. 우선 어떻게 구현되어 있는지를 봐야 되겠죠.
eclipse의 환경설정에서 소스 연결(JDK 설치 디렉토리의 src.jar)을 해놓으면 String과 같은 JDK에서 제공되는 클래스라도 소스 보는 것이 가능합니다. RuntimeMXBean이 인터페이스이기 때문에 소스를 봐야 메소드 정의만 있겠죠 그래서 getName()의 구현을 보기 위해서 다음과 같은 코드를 eclipse에서 작성했습니다.

public class Test {
  public static void main(String[] args) {
    RuntimeMXBean bean = null;
    bean.getName();
  }
}

그런 다음 getName()에 커서를 위치시킨 다음에 "Ctrl+T"를 눌러 implements 되어 있는 모든 type의 getName() 메소드 목록을 나타나게 했습니다. 그 다음은 마우스로 콕 찍어서 소스를 봤습니다.

사용자 삽입 이미지
실제 구현 클래스인 sun.management.RuntimeImpl가 오픈되었지만 자바 기본 패키지가 아니라서 소스는 나타나지 않습니다. 이런...
다음 단계를 곰곰히 생각해 봅니다. 어디 가면 RuntimeImpl에 대한 소스가 있을까요? 일단 두가지로 방법을 생각해 볼 수 있습니다. 현재 JDK는 오픈소스 프로젝트로 진행되고 있으니까 JDK 오픈소스 개발 사이트에서 다운로드 받는 방법이 있습니다. 두번째는 구글에서 검색하는 방법입니다. 구글에서는 소스코드만을 위한 검색 사이트를 제공하고 있습니다.(http://www.google.com/codesearch)
그래도 후배에게 JDK가 오픈소스로 진행되고 있다는 것과 소스를 보면서 여러 공부를 할 수 있다는 점을 가르쳐 주기 위해 JDK 오픈 소스 사이트를 이용하기로 했습니다(http://openjdk.java.net/). 소스 코드를 다운로드 받아서 해당 클래스를 찾아 봤습니다.

class RuntimeImpl implements RuntimeMXBean {
    private final VMManagement jvm;
    public String getName() {
        return jvm.getVmId();
    }
}   

이제 VMManagement를 찾아야 겠죠 *^^*

class VMManagementImpl implements VMManagement {
    public String getVmId() {
        int pid = getProcessId();
        String hostname = "localhost";
        try {
            hostname = InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
            // ignore
        }

        return pid + "@" + hostname;
    }
    private native int getProcessId();
}

결론은 RuntimeImpl에서 반환하는 값은 process id와 hostname이라는 것을 알 수 있습니다. porcess id를 가져 오는 것은 native 선언되어 있어 JNI를 이용하고 있습니다. 물론 구현은C로 되어 있겠죠.
다시 처음의 질문으로 돌아가면 자바에서 JVM의 process id를 가져오기 위해서는 JNI를 이용하거나 아니면 VMManagementImpl의 getPorcessId() 메소드를 호출하거나 RuntimeMXBean의 getName() 메소드에서 반환하는 값에서 "@"까지 substring해서 사용하는 방법을 찾게 되었습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/224

Leave a comment
« Previous : 1 : ... 202 : 203 : 204 : 205 : 206 : 207 : 208 : 209 : 210 : ... 388 : Next »