오늘 팀장님께서 복사한 문서를 한번 읽어 보라고 주셨다.
9개의 자바 성능 팁에 대해서 아~주 간단하게 정리되어 있는 문서다. (2페이지에 걸친...)
그 장의 첫번째 구문에는 Michael A. Jackson 이라는 할아버지가 쓴 글귀가 있다.
The First Rule of Optimization : Don't do it
The Second Rule of Optimization (for experts only) : Don't do it yet.
이 문서가 언제 쓴 문서인지는 모르겠지만.... 이 글귀는 약간 이해는 안된다. ^^;
Tip #1 : Object creation is bad
Tip #2 : static is good ==> I don't think so 다.
Tip #3 : Table switch good, lookup switch bad
Tip #4 : Small methods are good methods
Tip #5 : Exceptions are exceptional
Tip #6 : Use decorator patterns with care
Tip #7 : instanceof is faster on classes
Tip #8 : Use synchronized minimally
Tip #9 : Beware external libraries
물론 JVM 옵션 튜닝만 한다고 해서 답은 안나오겠지만,
튜닝할게 더이상 없다면, JVM 버젼 upgrade 및 옵션 튜닝을 해야 할 것이다.
아래는 이 글의 목차다.
뭐 다 읽기 귀찮으신 분들은 4.2 부터 적용해 보시면 된다.
1 Introduction
1.1 Goals
1.2 This is a Living Document
1.3 How to Use this White Paper
2 Best Practices
2.1 Use the most recent Java™ release
2.2 Get the latest Java™ update release
2.3 Insure your operating system patches are up-to-date
2.4 Eliminate variability
3 Making Decisions from Data
3.1 Beware of Microbenchmarks!
3.2 Use Statistics
3.3 Use a benchmark harness
4 Tuning Ideas
4.1 General Tuning Guidelines
4.1.1 Be Aware of Ergonomics Settings
4.1.2 Heap Sizing
4.1.3 Garbage Collector Policy
4.1.4 Other Tuning Parameters
4.2 Tuning Examples
4.2.1 Tuning Example 1: Tuning for Throughput
4.2.2 Tuning Example 2: Try the parallel old generation collector
4.2.3 Tuning Example 3: Try 256 MB pages
4.2.4 Tuning Example 4: Try -XX:+AggressiveOpts
4.2.5 Tuning Example 5: Try Biased Locking
4.2.6 Tuning Example 6: Tuning for low pause times and high throughput
4.2.7 Tuning Example 7: Try AggressiveOpts for low pause times and high throughput
5 Monitoring and Profiling
5.1 Monitoring
5.2 Profiling
6 Coding for Performance
7 Pointers
8 Feedback and the Java Performance Community
58 page 밑에서 7번째 줄 :
수행이 되어야 하므로 ==> 문제되는 메소드가 수행되어야 하므로
62 page 위에서 8번째 줄 :
이 부분은 ==> 네이티브 라이브러리는
68 page changeMessage ( ) 메소드에...(이 내용은 2쇄에도 반영 안되어 있음 - -):
currentName=new StringBuffer(); 를 메소드의 윗 부분에 추가...
75 page 밑에서 4번째 줄 :
StrinbBuffer ==> StringBuffer
로 변경
107 page 하단 소스 (2 쇄에도 반영 안되어 있음):
for(...;i < treeSet2.size(); ...) ==>
for 문 윗줄에 int treeSet2Size=treeSet2.size();
for(...; i < TREESET2SIZE ; ... )
으로 변경
114 page 두번째 소스:
catch 앞에 ] ==> }
로 변경하고
가장 하단에 } 추가
137 page 밑에서 8번째 줄:
두 가지 방식으로 사용할 수 있다. 이 메소드는 매개변수를 지정해야 한다. ==> 이 메소드는 다음과 같은 두 가지 방법으로 매개변수를 지정해서 사용한다.
196 page 위에서 8번째 줄:
해당 담 감사합니다. ==> 해당 담당자는 엄중 문책하겠습니다. 감사합니다.
회사 나가기 전에 같이 일하던 사람들에게 줄 선물로...
(책 써야하는데, 이런거나 맹글고 있으니 - -)
이게 뭘 하는 거냐면,
-성능 테스트를 하거나
-시스템을 운영하거나
-WAS의 문제로 장애가 났을때
개발자의 실수로 다른 Thread에 Lock(Block)을 발생시켰을 때
어떤 프로그램에서 발생했는지를 확인할 수 있는 그런 프로그램이다.
(뭐 똑똑하신 고급 개발자 분들께선 이미 이런거 만들어서 사용하고 계실테니 Pass...)
설치의 단순화를 위해서 JSP 딸랑 하나로 만들었으며,
JSP 하나에 넣기 위해서
HTML 노가다 + CSS 노가다 + JavaScript 노가다를 병행해서 개발했다.
두가지 버젼이 있는데, 하나는 메모리 정보를 보여주는 버젼, 다른 하나는 메모리 정보를 안보여 주는 버젼이다.
혹시라도 메모리 정보를 보여주면 서버에 부하가 발생할 수 있으니....
그림을 보면 알겠지만, 만약 다른 쓰레드를 잡고 있는 범인 쓰레드에 찐하게 표시를 해 주도록 해 놓았다.
원래 엄청나게 우울한 UI 였지만, 울팀 디자이너에게 별다방 커피 한잔 사준다고 꼬셔서 화면도 약간 이쁘게 포장했다.
이 프로그램을 왜 만들었냐면,
지난주 금요일에 성능 테스트를 하는데, XXXXXXXX 라는 프레임웍에서 사용하는 한 프로그램의 메소드에
Synchronized라는 블록을 써서 해당 메소드를 사용하는 다른 쓰레드의 응답속도가 엄청나게 증가하는 현상이 발생을 해서,
이런 문제를 제니퍼나 다른 모니터링 툴을 못 쓰는 사람들이 어떻게 잡을 수 있을까?
해서 만들게 되었다.
뭐 어찌보면, JConsole(이게 뭔지 모르는 분들은 제 책 보세욤...)을 써서 볼수 있겠지만,
서버에 부하가 많이 갈 수도 있고, 방화벽으로 막혀있는 상황이라면,
사용하기가 쉽지 않다.
아직 성능 테스트할 때 사용한 적은 없어서
(내 PC에서는 부하를 발생시켜서 테스트는 해 봤지만...)
해당 JSP를 아직은 공개하진 않을 예정이다.
뭐 소스가 이따구야~~
라는 분도 있을 수가 있고... ㅎㅎㅎ
혹~~ 써보고 싶은 분들은 저에게 이멜 보내주시면, 보내드리도록 하겠다.
메일 주소는 "자바 성능을 결정짓는 코딩 습관과 튜닝 이야기"에 있는 주소를 참조~~~ ㅎㅎ
Tomcat 5.5의 최신 버젼에서는 JConsole 모니터링이 안되도록 지정되어 있다. 이러한 문제를 해결하기 위해서, Tomcat의 catalina.bat나 .sh 파일의 JAVA_OPTS에 다음과 같은 옵션을 추가해 주어야 한다. -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
드디어 기다리던 Blog2Book 3호점 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기의 2쇄가 나왔습니다. 2쇄가 나오면서 드릴 말씀이 많지만.... 그동안 하고 싶었던 몇가지만 말씀드리겠습니다.
드리는 말씀 1 가장 먼저 드리고 싶은 이야기는 저자는 책을 내기 전에는 정신 수양을 미리 해야한다는 사실을 알았습니다. ^^; 책이 잘 팔려서 기분이 좋기는 하지만, 악평들 때문에 기분 나쁜건 어쩔 수 없더군요.
드리는 말씀 2 그래도 이 책을 내면서 기본적인 목적은 이뤘습니다. - 적어도 2쇄 찍기 (제 책이 나올 수 있도록 도와 주신분들에게는 2쇄가 나와야 본격적인 이득이 되기 때문에 ...) - 검색엔진에서 "자바 성능 튜닝"을 치면 제 책이 나오게 하기 (구글이나 네이버, 야후, 엠파스에서 한번 쳐 보시면 압니다. ^^)
드리는 말씀 3 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기는 제 첫 책입니다. (번역본과 멀티 캠퍼스 교재를 제외한...) 일반 서점이나 온라인 서점에서 팔리는 그런 책은 처음 쓴 셈이죠. 제 책에 대한 좋은 평들도 많이 있습니다. 그런 글을 블로그나 온라인 서점 사이트에 올려주신 분들에게는 이 글을 통해서 정말 고맙다고 말씀 드리고 싶습니다.
드리는 말씀 4 제 책에 대한 악평을 쓰신 분들에게는 아무말도 하지 않겠습니다. (그와 관련된 글을 몇번 썼다가, 지웠다가 했지만, 똑똑하신 여러분들의 이야기가 다 맞겠지요. ^^; 물론 제가 실수한 부분도 있긴 합니다. ㅋㅋ 2쇄에서 수정된 부분과 오타에 대해서는 조만간 정리 해서 올리겠습니다.)
드리는 말씀 5 제 책을 앞으로 사실 분들에게는 몇 마디만 말씀 드리겠습니다. (참고로 저는 초급, 중급, 고급 개발자의 기준은 모르겠습니다만 저는 제가 고급은 안되고, 중급 정도는 된다고 생각합니다. 초보는 아니니까 ^^) 본인이 고급이라고 생각하시는 분들중 성능에 대한 정리를 하고 싶은 분만 구매하셨으면 합니다. 절대 제 책은 고급 분들을 위한 책이 아닙니다. 제가 고급이 안되기 때문에 제가 쓴 책을 고급 분들이 보시면 안돼겠지요. 이제 갓 자바를 배우고 실무를 시작하시려는 초보 분들이라던지, 어느 정도 개발 경험이 있는데 자바 성능에 대한 궁금증을 어느 정도 확인하고 싶은 분들이 제 책을 구매하시기 바랍니다. 제가 책을 쓴 이유중 하나가 이겁니다. 매번 프로젝트에 갈때마다 로그 빼라, 스트링 잘써라 등등을 반복하는 것이 너무나 힘들고 싫었습니다. 그런 내용을 쓰다보니 자바 초보 분들을 위해서 기본적인 API에 대한 설명을 넣어야 이해가 쉽겠더군요.
제 책은 웹 시스템에서의 WAS에서 성능에 영향을 주는 부분을 어떻게 코딩해야 하는지를 정리한 책입니다. WAS자체를 개발하고, 코어 부분을 튜닝하는(0.01 ms가 중요한 그런)분들이 읽어야 하는 그런 책이 아닙니다. 그런 분들은 자바 언어 스펙 (번역본이나 원서), 이펙티브 자바, 자바 퍼포먼스 튜닝(한빛에 번역서가 있습니다.)등을 읽으시면 더 도움이 많이 될것 같습니다.
긴 글 읽어 주셔서 감사합니다.
PS : 만약 "자바 성능을 결정짓는 코딩 습관과 튜닝 이야기"의 5쇄가 나온다면, "자바 성능을 결정짓는 코딩 습관과 튜닝 그 두번째 이야기"로 보다 심도 깊은 이야기를 할까 생각하고 있습니다. ^^;