내가 기고한 어떤 글에 어느 분께서 질문을 올려서 여기에 정리한다.
질문의 골자는 "다른분께서 Perm 영역에서는 GC 가 발생 안한다고 했는데, Perm영역에서도 GC발생한다는 것이 이상하다"는 내용이다.
나도 내 눈으로 확인하기 전까지는 GC가 발생안한다고 생각했으므로 당연한 질문이라고 생각한다.
지금까지 내가 무슨 이야기하는지 이해가 안되시는 분은
이글 (http://helloworld.naver.com/helloworld/1329) 먼저 읽으시면 조금 이해가 쉬울 것이다.
다음의 소스를 보자.
public class InternTest {
public static void main(String[] args) throws Exception{
아주 간단한 소스인데, callIntern() 이라는 메소드를 보면 새로운 String을 계속 만들어 intern() 메소드를 호출하고 있다.
이 클래스를 컴파일하고 jstat으로 모니터링하면 다음과 같은 결과를 볼 수 있다.
(jstat에 대해서는 "자바 성능을 결정짓는 코딩 습관과 튜닝 이야기"를 참조하거나, http://helloworld.naver.com/helloworld/6043 를 참고하기 바란다.)
P라고 표시되어 있는 내용의 값이 계속 변경되는 것을 볼 수 있다.
여기서 P가 Perm 영역의 사용량(%)인데, 보는 것과 같이 그 크기가 지속적으로 바뀌는 것을 볼 수 있다.
그리고 우측에 있는 FGC라는 값도 증가하는 것이 보인다.
자바의 Perm 영역에 클래스와 메소드 정보만 저장되어 있다고 생각하는 것이 일반적이지만,
실제로는 intern된 String 값도 이 영역에 저장된다.
참고) intern된 String은 뭘까?
String은 기본적으로 equals()메소드로 값을 비교한다. 그렇게 되면 char값들을 비교하기 때문에 성능이 느릴 수 있지만, String 의 실제 값에 대해서 intern() 메소드를 호출하면 해당 값은 equals() 메소드가 아닌 == 으로 비교가 가능하다. 추가로 이 intern()메소드는 native 메소드로 선언되어 있다.
하지만, 이렇게 String비교를 조금 빠르게 하기 위해서 intern() 메소드를 호출한 후 결과를 비교하는 것은 Perm영역을 마구잡이로 사용하겠다는 의미이기 때문에 "절대" 권장하는 방법은 아니다. 그냥 이런 것이 있구나 정도로 참고하고 있기 바란다. ^^;
추가로,
Perm영역에 어떤 데이터들이 저장되어 있는지 보려면
jmap -permstat pid
명령어로 확인하면 되며,
그 결과에 가장 첫 출력물을 보면 interned String 크기가 출력된다.
top이라는 명령어로 리눅스를 모니터링하다보면
VIRT 와 RES가 있는 것을 볼 수 있다.
man top 에서 확인해 보니
VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out. (Note: you can define the STATSIZE=1 environment variable and the VIRT will be calculated from the /proc/#/state VmSize field.)
VIRT = SWAP + RES.
RES -- Resident size (kb)
The non-swapped physical memory a task has used.
RES = CODE + DATA.
요렇게 나온다.
결론적으로 해당 프로세스에서 물리적인 메모리를 사용하는 크기는 RES 이며,
SWAP 영역에서 사용하는 메모리 + shared + swapped를 합친것이 VIRT 다.
따라서 VIRT 값과 RES 값의 차이가 크다는 이야기는 SWAP 을 쓸 확률이 높다는 의미 인 것으로 보인다. 자바에서는 Shared 메모리의 크기가 그리 크지 않으므로, 만약 VIRT 만 크다면 SWAP 확인해 보고, 애플리케이션에서 도대체 무슨 일이 일어나는지를 잘 째려봐야 할 듯 하다.
subversion이라는 소스 저장소를 사용할 때 이클립스와 연동하려면,
suvversive 나 subclipse 중 하나를 선택해서 일반적으로 사용한다.
이번에는 subclipse를 설치했고,
방법은 다음과 같다.
1) Java HL 설치
subclipse가 c 기반으로 개발되어 있으므로, 이클립스와 통신하기 위해서는 자바 기반으로 되어 있는 Java HL 이라는 것을 설치해야만 한다. 여러가지 방법이 있겠지만, 맥에서는 그냥 맥포트를 사용하면 된다.
$ su
(root 권한으로 로긴)
$ port install subversion-javahlbindings
(Java HL 설치... 별걸 다 설치한다. ant, junit 등을 최신버전으로 ...)
마지막에 나오는 Java HL의 버전을 꼭 확인한다.
2) subclipse 설치 http://subclipse.tigris.org/
에서 Java HL 버전에 맞는 subclipse 업데이트 URL을 확인한 후 이클립스에서 설치 작업 진행.
그냥 모두 선택하고 설치하면 됨.
(뭐 자세한 내용은 다 알테니 패스)
이렇게 설치 해서
이클립스 --> 환경 설정 --> Team --> SVN 으로 이동했을 때, 중간에 있는 Java HL 드롭다운 박스에서 Java HL이 잘 먹혀 있다는 메시지가 나오면 끝.
(버전이 안맞으면 다시 설치해야함. 너무 앞서가서 subclipse를 최신 버전으로 깔아버리면 안됨 - -)
주의 : 본 내용은 지극히 개인적인 의견과 잘못 알아들은 부분도 있을 수 있으므로, 실제 제대로 된 내용은 PT 자료를 통해서 확인하셔야만 합니다요.
회사를 옮긴 이후에 운이 좋아서 작년에 이어 여차저차해서 ApacheCon이라는 해외 컨퍼런스에 참석하게 되었다.
올해는 밴쿠버에서 열렸고, Westin Bayshore라는 호텔(다운타운에서 20분은 걸어야 하는… 하지만 전망은 좋은)에서 진행했다.
벤쿠버에 4~5년전에 와이프랑 왔었기 때문에 여기저기 여행은 하지 않았다.
전반적인 분위기 :
전반적으로 그들만의 리그라는 생각이 많이 들었다.
여기서 그들은 Committer들과 영어 잘하는 (?) 사람들을 말한다.
컨퍼런스에 두번째이지만, 보통 동양사람들에게는 안면이 트이지 않는한 말을 잘 걸지 않고,
엄청나게 적극적이지 않으면 많은 대화를 하지 못한다는 것.
하지만, Meet up 이라는 야간 행사(20시~22시)에 관심사가 있는 사람들 및 커미터들과 이야기 할 기회가 있으니 적극 활용해야만 한다.
그리고, 한가지 더 중요한것은 매우 조촐했다는 것이다.
한 300명 정도밖에 안온것 같았고, 그 중 100명은 커미터라고 보면 될 듯 하다.
같은 기간에 하둡월드인가 뭔가가 있어 많은 사람들이 그 곳으로 간 것으로 보이며,
하둡과 클라우드 관련 세션은 3일 내내 진행되었기 때문에 클라우드가 전 세계적(?)으로 얼마나 인기가 많은지 알 것이다.
개략적인 진행 순서 : 참고로 각 기술에 대한 내용은 아래에 따로 정리하겠다.
D-1 : 컨퍼런스는 총 3일이지만,
그 전날에 University라고 해서 거진 70~100 만원을 내고 수업을 듣는게 있는데,
거의 신청한 사람이 없는듯 했다. (나도 물론 신청은 안했다.)
하지만 barCamp라는 것이 있고, 각 분야의 전문가들과 이야기할 수 있는 기회가 있다.
만약 앞서 이야기한대로 매우 적극적으로 뭔가 알아가려면, 하루 더 전에 와서 이 행사에 참여하는 게 좋을 듯 하다.
(스케줄에도 나와 있지 않다.)
예전에 같이 일하다가 다른 회사로 옮긴 X구라라는 선배를 우연찮게 만났고,
검색엔진인 Lucene을 만든 커미터도 잠깐 얼굴을 봤다.
(오며가며 보면 가장 인기가 많은 듯 해 보인다.)
Day 1 :
주제별로 Track이 있고 거기서 필요한 내용들을 찾아 들으면 된다.
보통의 우리나라 세미나와 다를게 거의 없다.
이날은 Tomcat 위주의 내용을 들었으며 TomEE와 죽어가는 Geronimo에 대해서 들었다.
첫날 저녁에는 식사를 제공하고 Meet up 이 있는데
나는 Callback이라는 PhoneGap의 오픈소스 버전에 대한 설명을 듣다가 Rave라는 것에 대해서 듣다가 나와서 잤다.
Day 2 :
첫째날과 동일하며 대부분 Httpd와 관련된 내용을 들었다.
Httpd 2.4와 Apache Traffic 서버가 인상 깊었고, 특히 Apache Traffic 서버 만든 아저씨는 오덕중에 오덕이었다. 이렇게 쌀쌀한 날씨에 반바지 입고 모자쓰고 발표했다. 게다가 유머 감감도 최고 였다. 누군가 올해 내로 정식 릴리즈가 되냐고 앞에서 조그맣게 이야기 했는데, "Go the hell"이라고 말하고 넘어가버렸다는...
저녁에는 앞에 나와서 아무런 주제로 한사람당 5분간 이야기하는게 있는데,
이건 뭐 슬라이드도 없어서 이해하기가 매우 어려워 듣다가 Tomcat Meet up 을 위해서 7-11에 가서 과자 부스러기를 갖고 와서 Tomcat Meet up 에 참석했다.
이 Meet up 의 결과에 대해서도 아래에 정리하겠다.
Day 3:
마지막 날에는 약간 어수선한 분위기와 함께 좀 흥미가 떨어지는 내용들이 많았다.
하지만 Kafka라는 것을 알게되어서 이날의 일정은 아깝지가 않았다.
마지막날은 5시에 땡~ 하고 끝나서 다운타운 가서 뭐 살거 없나 두리번 거리다가,
그냥 방에 와서 짐 정리하고 이 글을 쓰는 중이다.
그럼 이제 기술적인 이야기를 해보자.
Tomcat :
Tomcat Comet에 대해서 설명을 들었는데, 2001년부터 커미터로 있는 스페인 아저씨가 진행했다.
그냥 헬로월드 찍고 끝났다. 뭐 그 이하도 그 이상도 아니였다.
둘째날 저녁에 참석한 Meet up 은 조촐하게 10명 남짓이 모였으며, 그 중에서 5명 정도가 커미터였고 Comet 설명한 아저씨 옆에 앉았다. 사람이 적으니 각자 자기 소개를 하라고 했는데, 커미터들 소개를 하더니 모든사람에게 자기 소개를 하라고 했다.
내가 가장 마지막에 소개를 했고, 내가 어떤 회사에 일한다고 하니 다 알지 못했다.(뭐 당연하지…)
Tomcat 이 설치된 서버가 X대 정도 있다고 하니 모두 놀랐는데, 지금 생각해보면 한 두배 이상(세배가 될수도...)은 뻥튀기 한거 같다. ㅎㅎㅎ - -;
여하튼 내가 몇가지 궁금한 것과 Tomcat의 고칠점들에 대해서 이야기했는데, 대부분 잘 들어 주고 답변들도 잘 해줬다.
근데, 첨에 이야기한 항목은 고칠 생각이 없는듯 했다. 그냥 방법만 다들 알고 있는 알려주었을 뿐.(이건 사내 보안상 이야기 하긴 어렵고…) 5분이면 된다면서…
두번째 이야기한건 Web Socket 을 사내에 구현한게 있는데 연결당 메모리가 높아서 다른 웹서버로 갈까 하고 있다고 하니까 그건 들여다 봐야겠다고 했다.
그리고, 마지막 질문은 Tomcat 8은 언제 나오냐고 물어봤는데, 모두 일단 웃고 시작했다.
Servlet Spec 3.1의 Spec인 JSR 340( http://jcp.org/en/jsr/detail?id=340 ) 기준으로 할 것이며, 다들 아직 구현할 준비는 되어 있지 않아 보이고, 2013년에나 나올까? 라는 답만 들었다. 그렇다는 이야기는 Tomcat 8은 JDK 7 기반으로 된 WAS이기 때문에 JDK 7 기반의 서비스를 뭔가 하려면 Tomcat을 쓰는 회사는 적어도 2년 뒤인 2013년까지 기다려야 하고, 2014년은 되어야 안정적인 버전을 쓸수 있지 않을까하는 개인적인 생각이다.
추가로 25명 정도 되는 커미터중에 10명 남짓만 일하고 있으니, 참여하고 싶으면 언제든지 받아주겠다면서 Meet up이 끝났다. 그리고, Web Socket 관련된 이야기로 Meet up을 시작했었는데, 관련된 구현체가 없어서 일단 Apache Incubator 에 올리자고 결정이 되었다.
참고로 커미터중에 일본 친구가 한명 있어서 하둡쪽에 있는 일본 커미터와 같이 일했던 선배 4명이서 같이 저녁 식사를 했다. 많은 이야기를 나누었는데, 그 중에 "니네들 언제 만나냐?"고 물어보니 "ApacheCon 에서만 만난다. ㅎㅎ"라고 대답했다. 특히 Tomcat은 다국적인 친구들이 일을 하고 있어서 대부분 이슈 관련 보드와 메일로 내용을 주고 받으며, 그 일본 친구가 커미터에 들어가기 위해서 50번이나 트라이했다고 들었다.
TomEE(그냥 타미라고 발음하면 됨) :
J2EE 를 구현한 올해 초에 시작된 프로젝트로 OpenEJB와 OpenSSL등으로 구성되었다고 한다.
그러면서 절대 J2EE 자체가 무거운 것은 아니라고 재차 강조하고, WAS를 embedded 버전으로 띄워서 자동으로 테스트 코드를 실행하고 프로세스를 shutdown까지 하는데 4초밖에 안걸리는 데모를 보여주었다. 그러면서, 방금 돌린건 첫번째라서 그렇고, 두번째는 더 빨라집니다 하면서 돌렸는데도 4초 걸렸다. ㅎㅎㅎ 뻘쭘해 하면서 그냥 4초 걸린다고 알아라하고 넘겼다.
Geronimo :
그냥 죽은 WAS라고 생각하면 되며, 누군가 TomEE랑 뭐가 틀리냐고 물어보니 OSGi 적용이 가능하다고 이야기하면서 끝냈다. ㅋㅋ
Callback (PhoneGap) :
Apache incubator 에 있는 것이며, PhoneGap과 동일한데 아파치라이센스를 준수한다고 보면 된다. 그런데, 여기서 Apache incubator가 뭔지 잠깐 설명하면, 정상적인 Apache 프로젝트가 되기 위해서는 이 과정을 거친다고 한다.
여하튼 Callback은 웹앱을 하나 만들면 모든 플랫폼에서 돌아갈 수 있도록 하는 것이라고 생각하면 된다. 안드로이드, 아이폰, 블랙베리, 심지어는 바다 폰에서도 돌아간다고 한다. 어도비에서 나온 사람이 발표했고, 어도비에서 후원한다는 이야기를 많이 했다.
Rave :
이건 사내 인프라나 어떤 사이트를 아주 빠른 속도로 만들 수 있도록 미리 많은 기능들을 포함해 놓은 일종의 플랫폼이라고 보면 된다. 나중에 커미터에게 다국어 지원하냐고 물어봤는데, 다 된다고 이야기는 했다. 되는지는 확인해 봐야겠지만…
HTTPD(흔히 이야기하는 아파치 웹서버) v. 2.4 :
Jim이라는 백발이 성성한 Tomcat / Httpd 커미터 아저씨가 발표했다.
이번달에 최종 버전이 나온다고 한다. (지금까지는 베타)
Async I/O를 제공하고, 실시간 설정값 변경이 가능하며, Load Balancer 관리화면에서 실시간으로 부하를 분산하는 설정을 변경하는 것을 보여줬다.
참고로 Nginx가 가장 큰 경쟁자로 보였고, Nginx와의 성능 비교자료를 보여줬다.
Apache Traffic 서버 :
1999년 부터 사용되었고, Yahoo 로 넘어갔다가 올해 Apache 로 제공하는 Traffic 서버다. 정적인 데이터를 캐시해 놓는 능력이 탁월한 서버라고 보면 된다. 여튼 성능 하나는 가장 상위 목록에 들어가는듯 하다.
Apache Kafka :
이것도 인큐베이터에 있으며, Pub/Sub 서버(문서에서는 Broker라고 표현)라고 보면 된다. Producer가 대량의 데이터를 저장하고, 대량의 사용자에게 정보를 제공할 수 있는 서버다.
Linked In 에서 나온 인도 출신으로 보이는 여자 엔지니어가 발표했는데 매우 차분하게 말을 했는데도 불구하고 특유의 인도 억양이 좀 있어서 100 % 알아듣지는 못했다. (물론 다른 설명들도 100% 알아 들었다는건 절~대 아니다.)
여하튼 파일 기반의 데이터를 핸들링하며, 속도는 빠르지만 아직 해결해야 하는 항목들이 좀 남아있었다.
1. .vimrc 파일 만들기
맥에서는 .vimrc 파일이 기본으로 생성되어 있지 않다.
따라서, 다음의 절차를 따라가면 샘플에 있는 내용으로 .vimrc 파일이 생성된다.
vi
:edit ~/.vimrc
:read $VIMRUNTIME/vimrc_example.vim
:write
근데 개인적으론 그냥 웹에 있는 걸 다운로드 받아서 쓰는게 깔끔할 듯...
2. color pack 다운로드하고 필요한 폴더에 복사하기
이제 http://www.vim.org/scripts/script.php?script_id=625
으로 가서 가장 아래에 있는 zip 파일을 다운로드하고 나서 풀자.
plugin 과 colors라는 디렉터리를 계정 디렉터리 아래에 있는 .vim 디렉터리 밑으로 이동한다.
즉,
~/.vim/plugin
와
~/.vim/colors
가 되도록 하면 된다.
만약 .vim 디렉터리가 없더라도 당황하지 말고
mkdir .vim
이라고 하나 만들어 주자.
3. color 를 선택한 후 지정하기
vi .vimrc
를 쳐서 .vimrc 파일을 만들자.
위의 링크에 있는 여러 샘플중 마음에 드는걸 골라서 .vimrc 파일의 가장 첫줄에 다음과 같이 추가하자.
colorscheme darkblue
(갑자기 dark한게 좋아져서...)
이제 :wq 로 저장한 후 다시 vi를 들어가면 설정한 컬러 테마로 vi가 바뀌어 있을 것이다.
나의 네번째 책 집필 진도율이 51%를 찍었다. ㅎㅎㅎ
부록을 빼고 계산한 진도율이니,
아직도 많이 남은거다. - -;
처음에 계획한 Chapter수가 20개 였는데,
지금은 어느새 36개가 되었다.
(쓰다보니 필요한 것을 추가하고, 하나의 장이 너무 길면 자르고 해서 늘어났다.)
2. JDK 설치
Mac 사용자는 상관 없지만,
윈도우 사용자분들은 JDK를 반드시 6.0 이상 설치하셔야 하며,
C:\jdk1.6 폴더에 설치해 주시길 권장합니다.
C:\Program files 아래에 JDK를 설치하시면 실습이 매우 어려우니,
귀찮으시더라도 해당 폴더에 설치해 주시길 권장합니다.
3. 샘플 소스 다운로드
아래의 샘플 소스를 참석하실 PC에 다운로드 하셔서 갖고 오셔야만 합니다.
"자바 개발자와 시스템 운영자를 위한 트러블 슈팅 이야기"라는 깔끔한(?) 제목의 책이 조만간 나온다. (아마도 6월 중순에는 시중에 풀릴겁니다.)
2010년 1월 3일부터 집필을 시작하여 6개월간 딴 책(안드로이드)을 쓰다가 너무 광활한 범위에 포기하고, 올해 1월부터 다시 정리하기 시작하여 집필한 책이다.
이번 주말에 마지막 원고 리뷰 후 정리하면 6월 중순쯤 될 예정이다.
이 책의 구성은 다음과 같다.
- 웹 기반의 시스템의 장애 유형
- 쓰레드 문제와 해결 방법
- 메모리 문제와 해결 방법
- 진단을 위한 무료 툴들
- 많은 자바 개발자들이 취약한 리눅스에서 리소스를 모니터링 하는 방법
- 장애 유형에 따른 진단 절차
뭐 울트라 킹왕짱 자바 개발자 및 자바 엔지니어는 다 알고 있는 내용이므로 보실 필요는 없겠지만, 장애에 허덕이고 있는 분들은 이 책을 보면 문제 해결의 답이 보일 수도 있다.
WebTune, Jennifer, Pharos등의 APM들을 사용하는 분들이라도 그 툴들에서 잡을 수 없는 문제들을 잡는 방법이 나와 있기 때문에 분명 도움이 될 것이다. (이 툴들이 나쁘다거나 부족하다는 것은 저~~~얼대 아님)
지금까지의 내 책들과 다르게, 출판사에서 적극적으로 내가 쓴 모든 문장을 가독성이 좋도록 바꿨기 때문에 책에 대한 가독성은 크게 문제하지 않아도 된다.
최초에 보낸 원고의 페이지는 그리 많지 않았는데, 조판 작업 후 페이지가 많아져서 부득이하게 가격은 24,000 원으로 책정했다고 한다. T T;
내가 책정한 것은 아니니 저를 원망하지는 말아주시구요~~~
아무쪼록 이 책이 장애에 허덕이고 있는 많은 개발자와 시스템 운영자 분들에게 도움이 되길 바랍니다.