'Technical Note'에 해당되는 글 134건

Technical Note/JAVA

  • PrintGCDetails : GC 수행 상세 정보를 출력한다.
  • PrintGCTimeStamps : GC 발생 시간 정보를 출력한다.
  • PrintHeapAtGC : GC 발생시 Heap 상세 정보를 출력한다.
  • -Xloggc:<file>: GC Dump를 저장할 파일명을 지정한다. 따로 지정하지 않으면 Console에 바로 출력된다.\

-XX:+HeapDumpOnOutOfMemoryError : OutOfMemory Error발생시 Heap Dump자동 생성


참고 : http://wiki.ex-em.com/index.php/JVM_Options#PrintGCTimeStamps

Technical Note/JAVA

출처 : http://zbum.tistory.com/2


JVM  튜닝
http://blog.naver.com/PostView.nhn?blogId=salsu0&logNo=30076959340&parentCategoryNo=21&viewDate=&currentPage=1&listtype=0

http://www.boog.co.kr/boog/java_gc/idx=5

step 1. Application의 종류와 튜닝 목표값을 결정한다. 

JVM 튜닝을 하기 위해서 가장 중요한 것은 JVM 튜닝의 목표를 설정하는 것이다. 메모리를 적게 쓰는 것이 목표인지, GC 횟수를 줄이는 것이 목표인지, GC에 소요되는 시간이 목표인지, Application의 성능 (Throughput or response time) 향상인지를 먼저 정의한 후에, 그 목표치에 근접하도록 JVM Parameter를 조정하는 것이 필요하다. 

step 2. Heap Size와 Perm Size를 설정한다. 

-ms와 -mx 옵션을 이용하여 Heap Size를 정한다. 일반적으로 server application 인 경우에는 ms와 mx 사이즈를 같게 하는 것이 Memory 의 Growing과 shrinking 에 의한 불필요한 로드를 막을수 있어 권장할 만하다. 
ms와 mx 사이즈를 다르게 하는 경우는 Application  특정 시간대에 memory 사용량이 많은 Application에 효과적이다. 
PermSize는 JVM Vendor에 따라 다소 차이가 있으나 일반적으로 16m 정도이다. Client application 의 경우에는 문제가 없을 수 있지만, J2EE Server Application 의 경우 64~128 사이로 사용이 된다. 

Heap size와 Perm size는 아래의 과정을 통해서 적정 수치를 얻어가야 한다.


step 3. 테스트 및 로그 분석

JVM Option 에 GC 로그를 수집하기 위한  -verbosegc 옵션을 적용한다. 

-----------------------------------------------------------------------------------------------------------------------------------------------
"Concurrent GC"를 사용하면 Full GC시간과 횟수를 줄일수 있다고 하는데 어떻게 주어야 하며, Concurrent GC를 실제 환경에 적용해 보고 달라진 점은?

Parallel GC 와  Councurrent  GC를 적용해본 결과 
Parallel GC는 New Size의 크기가 고정이 되지 않는 문제점이 있었으며, (버그인듯..)
Concurrent GC에서도 크게 성능이 향상 되지 않았습니다.
실제로 Sun에서 튜닝을 잘해서 성능 향상을 얻었다는 사례는 들은적이 있었습니다만..
VM 패러미터를 아주 잘 써야 하는것으로 알고 있습니다.
일반적인 튜닝으로 Concurrent GC에서 성능 향상을 얻기는 쉽지 않은것으로 알고 있습니다.

이럴 경우 Default GC 사용하면서 JVM 튜닝을 시도해 보자

1. Full gc의 시간이나 횟수를 분석
  => 거의 일정한 간격으로 일정한 시간으로 Full GC 발생 -> 2번
  => 시간이 지날수록 점점 잦아지거나 시간이 길어질 경우 -> 3번

2. JVM Tuning
   1) NewSize를 늘리는 방법 
       : old :new 를 2:1 또는 4:1 정도까지 New를 늘려준다.
       minor GC를 덜 자주 하면, old 영역으로 넘어가는 객체 량을 줄일 수 있고, full GC 횟수를 줄일 수 있다.
       예를 들어 2시간 마다 한번씩 하던 것을 하루에 1번 한다던지요. 단 한번 full gc가 걸리면 소요시간은 동일하다.
 
   2) 전체 Heap size를 줄이는 방법
       이 방법은 full gc 를 보다 짧게, 자주 하게 한다.
       application 특성에 따라 사용자 체감속도는 더 느려질 수 있다. 


    http://java.sun.com/docs/hotspot/VMOptions.html
    http://java.sun.com/docs/hotspot/gc1.4.2/faq.html 참조 (주로 Sun JVM 위주입니다)

3. Application 문제 추적
이 현상은 memory leak 을 유발하는 application이 있을때 발생한다.
예를 들어, 캐슁 기능을 하는 클래스가 size 체크를
    하지 않아서 계속 collection 에 값을 쌓아 두게 되어 시간이 지날수록 사용자들이
    느리다고 불평하는 상황이었습니다.
    jeniffer 같은 툴을 사용하여 보다 쉽게 찾아낼 수 있습니다.

-----------------------------------------------------------------------------------------------------------------------------------------------

참고로, Sun JVM 튜닝 사례를 간략히 알려드립니다.

Solaris 9 (10 CPU, 16G mem)
Sun JVM 1.4.2_06
Sun Java System Application Server 7.1
시스템 특성: 24시간 수행업무, 설비제어, 3초 미만의 pause를 허용, WAS restart 허용안함

1. default 옵션일 때
  약 1시간 마다 2~3초 수행 -> 점점 주기가 빨라져서 30분 마다 최대 9.8초 까지 수행
  (여기서는 appl. 문제보다는, redeploy 를 반복하면서 perm 영역에 계속 클래스가 쌓여서
   시간과 주기가 잦아진 겁니다.)

2. concurrent GC 적용시
  약 360분 마다 0.22초 씩 Full GC 수행 (정확히는 concurrent 의 old gc 부분)

여러 튜닝 작업을 거쳐, 시스템 요구사항에 맞게 모든 GC를 1초 이내,
다시 말해 0.3초 이내로 수행하는 수준까지 튜닝이 이루어졌습니다.

진정 GC가 문제되어 사용자 체감속도가 느리다면,
GC 튜닝으로 많은 부분 해소 됩니다. (특히 Sun JVM 에서는)


-----------------------------------------------------------------------------------------------------------------------------------------------

Young GC를 Parallel Collector로 사용하면, 자동으로 AdaptiveSizePoliy가 동작합니다.
즉, 다음의 option을 on 한 상태로 됩니다.

-XX:+UseAdaptiveSizePolicy


그래서, Young 영역의 크기가 GC할 때마다 계속 변화하는 현상이 발생합니다.
이건 bug는 아닙니다.

이걸 막으려면,

-XX:NewSize=100m -XX:MaxNewSize=100m

와 같은 식으로 Young 영역의 크기를 고정시키면 해결은 됩니다.
통상적으로 Young 영역의 크기는 전체 heap의 1/3 정도로 셋팅하여 사용합니다.

- Parallel GC는 시스템의 CPU가 2개 이상인 경우라면 사용을 적극 권고합니다.
  무조건 좋아집니다. 단, CPU의 수에 비례하는 만큼 좋아지지는 않습니다.

- CMS (Concurrent Mark Sweep)은 GC의 pause time을 줄여 주기는 합니다만,
  risk한 측면이 있습니다. 즉, 언젠가는 Seiral한 Full GC를 발생시킵니다.
  그리고, CMS를 사용한다면, 전체 heap의 크기를 좀 더 크게 키워서 셋팅해야 합니다.
  통상적으로 30-50%정도.
  이는 CMS는 application thread와 gc thread가 동시에 동작하므로,
  Old 영역의 heap이 좀 더 여유가 있어야 하기때문입니다.

이 두가지 옵션 다 jdk 1.4.2 환경이라면 사용 가능합니다.

그리고, 의외의 GC 문제가 perm size에서 발생합니다.

결론을 말씀드리면,
Parallel GC는 (무조건) 강추
CMS는 상황을 고려하여 사용할 것을 추천

------------------------------------------------------------------------------------------------------------------------
Full GC 순간 느려지는 현상을 해결하기 위한 방법

트래픽이 한번에 몰리는 상황에 Full GC를 만나서 느려지는경우를 막는 방법은 없습니다.

최대한 멈추는 시간을 줄이는 방법 밖에요.


Old 영역을 줄이는 방법과, ParallelGC를 이용하는 방법이 대표적인데요.

Old 영역이 줄어들면 FullGC할꺼리가 없어지니 FullGC시간이 줄어들 테구요.

여러개의 CPU가 달린 컴퓨터에서 모든 CPU를 이용하여 병렬적으로 GC를 하도록 하는것입니다.


Old영역 줄이는 명령어는 New영역을 지정함으로써 조정가능하구요.

예를들어

-Xms2G -Xmx2G -XX:NewSize=1500m -XX:MaxNewSize=1500m

의 경우에는 전체 메모리를 2기가로 잡고 New 영역을 1500메가로 잡음으로써 Old영역을 500메가로 잡습니다.


두번째 ParallelCG는 -XX:+UseParallelOldGC 옵션을 줌으로써 조절 가능합니다.



Technical Note/JAVA

VM 에서 사용하는 메모리 힙은 두 가지로 존재한다.


1. java object를 할당하기 위한 java heap
2. jvm 자체적으로 사용하기 위한 native heap

native heap에는 다음과 같은것이 포함

a. 가장 기초 thread를 제외한 모든 thread
b. buffer, lookup table 및 ZIP 관련 작업(GZIPOutputStream methods)
c. Swing.AWT 하에서 native GUI와 관련된 Buffer 및 구조체
d. JNI code에 의해 사용된 data
e. Just-in-time(JIT) compiler 및 Mixed-Mode-interperter(MMI)를 지원하는 함수
f. JIT 관련 수행 코드


Technical Note

나의 시장가치를 높이기 위해서는 어떻게 해야 할까?

지속적인 배움이 필요할것 같다

나의 역량은 내 스스로 책임을 져야 겠지?

지속적으로 배움을 유지하는 방법에 대해서 찾아보았다.


- 잡지와 블로그, 트위터 피드와 웹사이트, 책을 읽으십시오. 좀더 세부적인 깊은 주제를 원한다면 메일링 리스트와 뉴스그룹 가입을 고려해야 합니다.


- 어떤 기술에 몰입하기를 원한다면, 손에 잡히는 대로 코딩을 해야 합니다.


- 여러분의 교육을 연기할 수 있는 최고의 전문가인, 멘토와 항상 함께 일하도록 노력하십시오. 누구에게라도 배울점은 있겠으나, 여러분보다 더 똑똑한 사람 또는 경험이 더 많은 사람에게서 더 많은 것을 배울수 있습니다. 멘토를 찾지 못하며느 업무이동을 고려해 보십시오


- 가상의 멘토를 만드십시오. 여러분이 정말 좋아하는 작가나 개발자를 웹에서 찾아보고 그들이 쓴 글을 모두 읽어 보십시오. 그들의 블로그들을 구독해 보십시오.


- 여러분이 사용하는 프레임워크와 라이브러리를 알아야 합니다. 어떤것의 동작 원리를 이해한다는것은 그것을 좀더 잘 활용할수있다는 것입니다. 만약 그것이 오픈소스라면, 여러분은 정말 운이 좋은것입니다. 코드를 구석구석 보기 위해 무엇이 진행되는지 디버거를 사용해 보십시오. 여러분은 정말 뛰어난 사람들의 리뷰를거쳐 작성된 소스 코드를 볼수있을 것입니다.


- 실수 할때마다 버그를 수정하고, 문제를 고치고, 무엇이 우연히 일어났는지 실제로 이해하도록 노력해야 합니다.  우연히 여러분과 같은 문제에 부딪힌 누군가가 해결책을 웹의 어딘가에 올려 놓았을지도 모릅니다. 이럴때는 구글이 유용합니다.


- 무언가를 진정으로 배우는 좋은 방법은 그것에 대해 말하고 가르쳐 보는 것입니다. 사람들이 여러분의 말을 들으려 하고 질문을 할때, 여러분은 배움에 대해 동기 부여 될수 있습니다. 사용자 그룹, 지역 컨퍼런스, 직장에서도 끊임없이 배우십시오.


- 스터디 그룹(패턴 커뮤니티) 또는 개발 언어에 대한 지역 사용자 그룹, 기술 등 관심있는 활동을 시작하거나 참가해야 합니다.


- 컨퍼런스에 가십시오. 만약 갈 수 없다면, 온라인으로 진행되는 많은 무료 컨퍼런스들을 알아보십시오


- 출퇴근 시간이 길다면 팟캐스트를 들으십시오.


- 통합개발환경기반에서 경고 메시지가 뜨는 것을 보거나 코드 기반의 정적 분석도구를 수행해야 합니다. 왜, 무엇때문에 문제가 보고되었는지 이해해야 합니다.


- 앤드류 헌트와 데이비드 토마스의 '실용주의 프로그래머'에서 가르쳐주는 조언을 따르고 매년 새로운 언어를 하나씩 배우십시오. 적어도 새로운 기술과 도구는 배워야 합니다. 새로운 기술영역에서 활용할 수 있는 새아이디어를 제안해야 합니다.


- 여러분이 배우는 것이 기술에 대한 모든것은 아닙니다. 여러분이 일하고 있는 도메인을 배우십시오. 그러면 좀 더 많은 요구사항을 이해할수 있으며, 비즈니스 문제를 푸는데 도움을 받을 수 있습니다. 어떻게 하면 좀더 생산적으로 될까, 어떻게 하면 좀더 나아질까를 배우는 것은 중요합니다. 


- 학교로 돌아가십시오


영롸 '메트릭스'의 '네오'와 같이 필요한 시직은 머리에 다운로드 할 수 있는 능력이 있으면 좋겠지만, 난 사람이므로, 시간을 투자해야 할 것 같다.

깨어있는 모든 시간을 배우는데 쓸수는 없겠지만, 아무것도 안하는것보다 매주 조금의 시간을 내는것이 좋을것 같다. 습관적으로 꾸준히 한다는것이 정말 중요한것 같다

그러다 보면 쌓이고 쌓여 언제가는 나의 멋진 자신이 되어 있겠지?

기술은 빠르게 변하고 있다. 뒤처지지 말자.

아직은 젊으니 달려야 하지 않겠는가?



1 ··· 24 25 26 27
블로그 이미지

zzikjh