티스토리 뷰

Oracle 성능을 하다가 Java 성능으로 영역을 확장하면서 힘들었던 것은 무엇을 공부해야 할지를 정하는 것이었다. Java라는 것이 용어부터 너무도 많고 기술도 너무 많았기 때문에 이것 저것 하다보면 남는 것도 없이 분주하기만 할 뿐이었다. WAS 벤더들의 교육을 찾아 다녀도 마찬가지였다. 자신들의 WAS에 특화된 부분에 대해서 얘기를 듣다보면 성능 문제를 일으키는 근본적인 요소들에 대해서는 잘 파악이 되지 않았던 것이다.

그래서 마늘과 쑥을 가지고 동굴로 들어간 곰과 호랑이 처럼 파묻혀 고민을 하던 차에 갑자기 눈앞이 밝아짐을 느꼈다. 자바는 어떤 것이든 JVM위에서 움직이게 되고 WAS라 할지라도 JVM의 입장에서 보면 하나의 어플리케이션에 지나지 않는다는 것과 시스템 입장에서 JVM은 하나의 프로세스에 지나지 않는 다는 것이었다.

즉 Java의 성능을 파헤치기 위해서는 JVM을 먼저 알아야겠다는 생각을 하게 되었다. 이것이 작년 8월의 일이었다. 그 이후 나는 JVM에 대한 책과 자료를 찾기 시작했지만 이도 또한 쉬운일이 아니었다. JVM을 묶어서 설명해 놓은 책은 단 한권만 있을 뿐이고 이마저도 너무나 예날에 발간된 것이었기 때문이다. 그래서 내가 각각 자료를 모으고 정리를 하기 시작했다.



이 블로그에도 초기의 자료들이 약간 남아있다. 책의 내용에 비하면 이 내용은 정말 새발의 피, 새중에서도 참새 정도로 작은 새의 피정도 밖에 되지 않는다.
사실 Java의 프레임워크나 WAS에 비해 JVM에 쏟는 관심은 거의 없다. 그러나 아마 Java의 대부분의 성능 문제는 JVM을 잘 이해하지 못하기 때문에 발생한다고 생각한다. 발생한 성능 문제를 이해하거나 분석할 때도 그렇지만 어플리케이션을 만들 때도 JVM에서 나의 프로그램이 어떻게 동작할지 머리속으로 그려볼 수 있다면 보다 많은 문제를 미연에 방지할 수 있을 것이라 생각한다.

이를 위해 이 책에서는 JVM의 각 모듈에 대한 설명을 담고있다. 이야기는 실행 메모리 영역인 Runtime Data Areas부터 시작하게 된다. JVM이 프로세스로 동작하기 시작하면 Runtime Data Areas가 메모리에 생성된다. 가끔 문제를 일으키는 Heap도 여기에 포함되는 것이다. 그 밖에 Permanent Area로 알려져 있는 Method Area등도 여기에 속하게 된다.

그 다음 얘기는 Garbage Collection에 대한 것이다. Garbage Collection을 얘기하면서 Sun, Oracle, HP, Windows, Linux에서 사용되는 Hotspot JVM과 IBM 에서 사용되는 JVM의 서로 다른 Heap 및 Heap Object Layout을 디테일하게 다루고 있다. 특히 Sun에서 나온 JVM과 IBM JVM이 비슷할 것이라는 생각은 이 장을 보면 여지없이 깨어지게 될 것으로 생각된다.

이 두 JVM은 태생부터 Heap의 구조 그리고 Garbage Collection 까지 너무도 다르기 때문에 성능문제를 분석하기 위해서는 각각의 내부 메커니즘을 따로 알아야 한다. 이 책에서는 이러한 부분을 버전 별로 구분하여 다루고 있다. 특히 Sun JVM의 경우 Java 7에서 기본 Garbage Collector로 탑재될 Garbage First Collector에 대해서도 자세하게 소개가 되고 있다.

Garbage Collection은 책의 1/4의 분량을 차지할 정도로 방대한 양이 수록되어 있다. 그 밖에 Class Loader, Execution Engine, Thread Synchronization에 대한 부분을 그 뒤를 잇게 된다. Execution Engine에서는 JIT Compiler와 Hotspot Compiler가 무엇이고 어떤 차이가 있으며 내부적으로 어떻게 처리가 되는지에 대해 상세하게 다루고 있다.

Thread Synchronization의 경우는 단지 동기화가 code상에서 어떻게 동작하는지에 대한 설명보다는 JVM 내부적으로 어떤 메커니즘을 통해 동기화가 일어나게 되는지, 그리고 Biased Lock이나 Lock Reservation 등이 어떻게 구현이 되고 있는지를 자세하게 설명하고 있다.

이 책에는 JVM Internal 뿐만이 아니라 Oracle JDBC의 성능에 대한 부분도 다루고 있다. 이 부분은 WAS성능 분석을 하면서 성능의 사각으로 JDBC가 존재한다고 생각해 왔기 때문에 집어 넣은 것이다. 사실 이 주제로 책을 한권 내는 것은 좀 무리가 있지 싶어 이 책의 후반부에 끼어넣은 것이 속사정이라면 속사정이다.

여기서 다루고 있는 것은 사실 요즘 같이 프레임워크가 대세가 된 시점에서는 별 흥미를 끌 내용은 아니지만 어차피 Java 성능의 메커니즘을 설명하고자 하는 것이 이 책의 목적이었기 때문에 이 부분을 집어 넣었다. 핵심은 어플리케이션과 Oracle사이의 roundtrip이 성능에 큰 영향을 미친다는 것이다. 몰라도 된다고 치부할 수도 있겠지만 알면 두고두고 유익할 내용이라 자부한다. (아 민망해라~)

이 책에는 이러한 내용들이 수록되어 있다. 나름대로 이 책은 앞서 말한 내용이 성능의 근간을 이룬다는 점에서 필독도서가 되어야 하고, 또한 JVM을 다룬 국내 유일의 책이라는 희소성까지 겸비하고 있어 소장가치까지 있다고 생각한다. (점점 뻔뻔해 지고 있는 나~ 고만해야겠다.)

이 책의 보다 진지한 소개는 http://wiki.ex-em.com/index.php/Java_performance_fundamental 에서 찾아 볼 수 있고 구입은 yes24, InterPark, 강컴, 알라딘, 교보문고, 반디앤루니스를 통해 가능하다.
저작자 표시 비영리 변경 금지
신고

'기술이야기' 카테고리의 다른 글

JVM Architecture  (0) 2009.10.27
Java Performance Fundamental 책이 출간되었습니다.  (1) 2009.10.26
Exem OnAir  (1) 2009.10.13
Heap Memory는 어떻게 할당될까..?  (0) 2009.06.04
댓글
댓글쓰기 폼