오늘 팀장님께서 복사한 문서를 한번 읽어 보라고 주셨다.
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
먼저 위의 인터뷰 내용을 읽어보자.
Garbage First Collector가 뭔지 대충 감을 잡을 것이다.
분명 대부분 안읽어 보시겠지만....적어도 아래 줄들은 일어 주기 바란다.
G1=next-generation low-pause garbage collector
G1 will ultimately replace the Concurrent Mark-Sweep (CMS) garbage collector
G1, even though it is generational, there is no physical separation between the two generations.
Three Objectives of G1 The first objective is consistent low pauses over time.
The second objective is to avoid, as much as possible, having a full GC.
The final objective is good throughput.
if you care about getting the job done as quickly as possible, and don't care much for how long your application is going to be stopped by the garbage collector, the throughput collector is the best choice.
if you have a batch job that is going to take a few minutes or a few hours and you want it to be done as quickly as possible, then a throughput collector is clearly the best choice.
But, if you are working on a very interactive job that needs to interact with people, other applications, or users through web pages, then a low latency garbage collector is the best choice.
Why does garbage collection take so long? ==> Garbage collection is very memory-bound. And memory speeds these days are quite slow compared to CPU speeds
그리고, 저 이너뷰 한 사람이 사진을 잘 찍는가본데, 사진과 개발과의 상관관계를 아래와 같이 이야기 했다.
You need to be committed and to be patient and try out things again and again, to make sure that you get it just right. I see some parallels between photography and development.
마지막엔 그가 이야기하는 아름다운 코드란....
Beautiful code is code that is simple, easy to understand, and efficient
란다.
물론 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
일시: 2009년 2월12일 목요일 18:00 ~ 20:00
장소: 멀티 캠퍼스 1702호
=========================================================================
18:00 ~ 18:05 세미나 소개
18:05 ~ 18:30 효과적인 테스트 코드 작성(황상철 책임 SDS)
18:30 ~ 18:40 휴식
18:40 ~ 19:05 Secure Web Application(채수민 책임 SDS)
19:05 ~ 19:15 휴식
19:15 ~ 19:40 넵튠(Neptune) 과 하둡(Hadoop) 소개 (김형준 NHN)
19:40 ~ 20:00 Q&A 및 세미나 정리
=========================================================================
이번 세미나도 알차게 준비했습니다.
NHN의 김형준 실장이 새로운 오픈소스인 넵튠과 요즘 GFS로 많은 인기를 끌고 있는 하둡에 대해 소개할 예정이며,
보안그룹의 보안 전문가인 채수민 책임이 안전하게 웹 애플리케이션을 개발하는 방법에 대해 강의합니다.
끝으로 단위 테스트를 제대로 할 수 있도록 효과적으로 테스트 코드를 작성하는 법에 대해 제가 발표를 진행합니다.
자리가 한정되어 있습니다. 참여를 원하시는 분은 황상철 책임님에게 메일로 신청해 주시면 감사하겠습니다.
알차고 재미있는 시간이 될것을 약속드리며 엔지니어링에 관심있는 분들의 많은 참여 부탁드립니다.
자바 HotSpot은 일종의 자바 가상머신의 구현으로, 자바 HotSpot VM에는 다음과 같은 자바 플랫폼을 위한 핵심 실행 엔진이 포함됩니다:
자바 바이트코드를 지원 하드웨어 플랫폼 상에서 최적화된 네이티브 기계어 코드로 변환하는 동적 컴파일러
메모리 관리 및 가비지 컬렉션 서브시스템
스레드 및 동기화
모니터링, 디버깅, 프로파일링 텔레메트리(profiling telemetry)
바이트코드 검사기(bytecode verifier)를 포함한 자바 보안 아키텍처 부분들
HotSpot은 그 자체가 “일단 한번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)”라는 자바 기술의 약속을 가장 구체적으로 실현한 Java SE 플랫폼 컴포넌트라 할 수 있습니다.
개발자들은 이 코드를 통해 세계 최고 수준의 가상머신이 어떻게 구축되는지 살펴볼 수 있을 뿐 아니라, 버그 픽스, 그리고 새로운 가비지 컬렉션, 동기화, 바이트코드 컴파일러 알고리즘의 테스트, VM을 새로운 하드웨어 아키텍처와 운영체제에 이식하는 등의 작업을 수행할 수 있게 됩니다.
링크를 보면 몇몇가지 설정할 게 있으니 참조하기 바란다.
간단하게 정리하면(윈도우용)
1. bin 디렉토리를 path에 추가
2. AS_ADMIN_USER 라는 것을 환경 변수에 추가하고, 설치할때의 PC나 서버 계정을 추가한다.
서버를 다음의 명령어로 시작할 수 있다.
asadmin start-domain domain1
정상적으로 수행되었다면 다음과 같은 메시지가 나타난다.
도메인 domain1을(를) 시작합니다. 잠시 기다려 주십시오.
로그가 D:\glassfish\domains\domain1\logs\server.log(으)로 리디렉션되었습니다.
마스터 비밀번호를 입력하십시오>
출력을 D:/glassfish/domains/domain1/logs/server.log(으)로 리디렉션하는 중
도메인 domain1에서 클라이언트 요청을 받을 준비가 되었습니다. 백그라운드에서 추가
서비스를 시작하는 중입니다.
다음에서 해당 구성 및 로그를 사용하여 도메인 [domain1]이(가) [Sun Java System Ap
plication Server 9.1_02 (build b04-fcs)]을(를) 실행하는 중입니다: [D:\glassfish\
domains].
관리 콘솔은 [http://localhost:4848]에서 사용할 수 있습니다.
"asadmin" 명령에도 같은 포트 [4848]을(를) 사용합니다.
사용자 웹 응용 프로그램은 다음 URL에서 사용할 수 있습니다:
[http://localhost:8080 https://localhost:8181 ].
다음 웹 내용을 사용할 수 있습니다:
[/web1 /__wstx-services ].
표준 JMX 클라이언트(예, JConsole)는 도메인 관리를 위해 JMXServiceURL:
[service:jmx:rmi:///jndi/rmi://smlee:8686/jmxrmi]에 연결될 수 있습니다.
도메인은 최소한 다음 포트에서 연결을 수신합니다:
[8080 8181 4848 3700 3820 3920 8686 ].
도메인이 Application Server 클러스터 및 다른 독립 실행형 인스턴스를 지원하지 않
습니다.
설치시 유의사항 서버를 수행할때 리눅스는 상관 없겠지만,
PC 이름이 한글일 경우 서버가 정상적으로 뜨지 않을 수 있다.
이 경우 domain1/logs 디렉토리의 server.log 파일에 다음과 같은 메시지가 나타난다.
com.sun.appserv.server.ServerLifecycleException
at com.sun.enterprise.admin.server.core.JmxConnectorLifecycle.onStartup(JmxConnectorLifecycle.java:153)
at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:442)
at com.sun.enterprise.server.ondemand.OnDemandServer.onStartup(OnDemandServer.java:120)
at com.sun.enterprise.server.PEMain.run(PEMain.java:411)
at com.sun.enterprise.server.PEMain.main(PEMain.java:338)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.server.PELaunch.main(PELaunch.java:412)
Caused by: java.lang.NullPointerException
at javax.management.remote.JMXConnectorServerFactory.newJMXConnectorServer(JMXConnectorServerFactory.java:283)
at com.sun.enterprise.admin.jmx.remote.server.rmi.JmxConnectorServerDriver.startConnectorServer(JmxConnectorServerDriver.java:215)
at com.sun.enterprise.admin.server.core.JmxConnectorLifecycle.onStartup(JmxConnectorLifecycle.java:134)
... 9 more
Glassfish를 설치하고 나서 가장 황당했던것이, bin 디렉토리에 아무것도 실행파일이 없다는 것이다.
관련 문서도 눌러 보면 Glassfish에 대한 문서가 아니라, Sun Java System Application Server 에 대한 문서고... - -;
Glassfish의 압축을 푼 root 디렉토리를 보면 setup.xml과 setup-cluster.xml 두개의 파일이 존재한다.
클러스터 구성할 것이 아니라면 setup.xml을 사용하면 된다.
Ant를 이용하여 설치하기
그래서, 가장 먼저 ant를 설치해야 한다. (그런데 친절하게도 glassfish\lib\ant 디렉토리가 포함되어 있으며, 여기의 실행파일을 사용해도 된다.)
ant의 bin 디렉토리를 갖고 있는 장비의 path에 등록을 하고,
setup.xml 파일이 있는 위치에서 다음의 명령을 수행한다.
-do.copy.common:
[copy] Copying 1 file to D:\glassfish\config
do.copy.windows:
[copy] Copying 1 file to D:\glassfish\config
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\bin
[copy] Copying 1 file to D:\glassfish\updatecenter\bin
do.copy.unix:
do.copy:
get.java.home:
setup.init:
-do.tokenrep.common:
do.token.windows:
do.token.unix:
do.token.jdic.windows:
do.token.jdic.solaris-sparc:
do.token.jdic.solaris-x86:
do.token.jdic.linux:
do.token.jdic.mac:
do.token.jdic:
do.token.enable.uc:
do.token:
get.java.home:
setup.init:
do.chmod.unix:
do.chmod:
create-local-registry:
setup.reg:
[echo] Creating the service registry file..
[java] From Local service registry ..
get.java.home:
setup.init:
set.env.win:
set.env.unix:
set.env:
create.domain:
[exec] 포트 4848을(를) Admin에 대해 사용합니다.
[exec] 포트 8080을(를) HTTP Instance에 대해 사용합니다.
[exec] 포트 7676을(를) JMS에 대해 사용합니다.
[exec] 포트 3700을(를) IIOP에 대해 사용합니다.
[exec] 포트 8181을(를) HTTP_SSL에 대해 사용합니다.
[exec] 기본 포트 3820을(를) IIOP_SSL에 대해 사용합니다.
[exec] 기본 포트 3920을(를) IIOP_MUTUALAUTH에 대해 사용합니다.
[exec] 기본 포트 8686을(를) JMX_ADMIN에 대해 사용합니다.
[exec] 프로필을 사용하여 도메인을 만드는 중입니다: developer(구성 파일의 변
수 AS_ADMIN_PROFILE로에 지정)
[exec] 지정된 로켈[ko_KR]의 파일을 [D:\glassfish\lib\install\templates\loca
les\ko_KR\index.html]에서 찾지 못했습니다. 대신 기본 (en_US) index.html을 사용합
니다.
[exec] 보안 저장소 사용: JKS
[exec] 도메인 domain1이(가) 만들어졌습니다.
[exec] 이 도메인 [domain1]의 관리자 이름 [admin]에 관련된 로그인 정보를 [C:
\Documents and Settings\smlee\.asadminpass]에 성공적으로 저장했습니다.
[exec] 이 파일은 계속 보호되어야 합니다. 이 파일에 저장된 정보는 asadmin 명
령에서 이 도메인을 관리하는 데 사용됩니다.
[delete] Deleting: D:\glassfish\passfile
BUILD SUCCESSFUL
Total time: 29 seconds
D:\glassfish>
Glassfish는 J2EE 5를 따르는 오픈소스 애플리케이션 서버를 말한다. 참고로 J2EE 5 는 -JavaServer Pages(JSP) 2.1 -JavaServer Faces(JSF) 1.2 -Servlet 2.5 -Enterprise JavaBeans 3.0 -Java API for Web Services(JAX-WS) 2.0 -Java Architecture for XML Binding(JAXB) 2.0 -Web Services Metadata for the Java Platform 1.0 라는 여러 표준의 버젼을 따른다.
Glassfish 설치하기 Jar를 다운로드 했다면, jar파일이 있는 위치에서 다음의 명령어를 친다. java -Xmx256m -jar jar파일명 그러면 동의하라는 반 강제적 화면이 나타나고, 스크롤을 아래로 주루룩 내린 후 동의를 하면, 파일들의 압축이 풀릴것이다.