'Java'에 해당되는 글 63건

  1. 2009.06.05 [GC] 자바의 CMS(Concurrent Mark & Sweep)을 대체할 G1
  2. 2009.05.25 [GC] Java GC Tuning 방법 (자바 메모리 튜닝)
  3. 2009.04.10 [Java Performance Tips] 자바 성능 팁
  4. 2009.03.11 [정규 표현식 분석기] 웹 기반의 정규 표현식 분석기 1
  5. 2009.03.09 [자바 스택정보 보기] jstack을 이용해서 스택정보(쓰레드 덤프, Thread dump) 확인
  6. 2009.03.06 한빛 미디어 도서를 이용한 Java Roadmap
  7. 2009.02.25 [Garbage First] G1 콜렉터란 ??? 1
  8. 2009.02.19 [NetBeans 성능 튜닝 관련 링크 모음] 넷빈즈 사이트에서 제공하는 성능 관련 링크들
  9. 2009.02.19 [자바 메모리 옵션 튜닝] Sun 에서 제공하는 자바 메모리 옵션 튜닝
  10. 2009.02.11 [Java Runtime] Java Runtime.exec() 메소드가 잘 안돌아 갈 때 (CreateProcess error=2 발생)
  11. 2009.02.07 [자바 기본 강좌] 자바라는 단어만 들어도 스트레스를 받는 분들을 위한 초보 강좌-05 public, protected, private
  12. 2009.02.06 [자바 기본 강좌] 자바라는 단어만 들어도 스트레스를 받는 분들을 위한 초보 강좌-04 equals와 == 의 차이점
  13. 2009.01.28 [성능 튜닝 가이드] 기본적인 자바 성능 튜닝 가이드
  14. 2009.01.28 [자바 기본 강좌] 자바라는 단어만 들어도 스트레스를 받는 분들을 위한 초보 강좌-03 자바 개발 툴
  15. 2009.01.25 [자바 기본 강좌] 자바라는 단어만 들어도 스트레스를 받는 분들을 위한 초보 강좌-02 JVM과 HotSpot
  16. 2009.01.19 [JVM Option] 자바 성능 튜닝에 대한 좋은 글- JVM Option 위주의 튜닝 방법
  17. 2009.01.11 [J2EE Cache] ehcache를 사용한 페이지 캐시
  18. 2009.01.08 [자바 기본 강좌] 자바라는 단어만 들어도 스트레스를 받는 분들을 위한 초보 강좌-01 JDK와 JRE
  19. 2008.07.18 [쓰레드 덤프 분석] 자바 쓰레드 덤프 분석을 통한 병목 구간 찾기
  20. 2008.07.05 [Link] 자바 JVM에 대한 튜닝에 대한 자료가 잘 정리되어 있는 사이트
  21. 2008.07.05 [Link] AIX (IBM JVM사용시)에서의 자바 문제 해결 방법
  22. 2008.06.13 [Memory leak] Oracle의 OCI를 사용할 때 C Heap 과 관련된 OutOfMemoryError가 발생할 때
  23. 2008.06.04 [Java Basic] 자바 주석 (자바 코멘트) 관련 문서
  24. 2008.05.15 [Java Basic] Regular Expression (정규식, 정규 표현식)의 형식
  25. 2008.05.14 [Java Basic] Regular Expression (정규식, 정규 표현식)의 기본
  26. 2008.04.01 [링크] 자바의 어노테이션 (Annotation)
  27. 2008.02.23 [링크] 자바 기본을 키울수 있는 튜토리얼
  28. 2008.02.23 [링크] HP의 JVM 옵션
  29. 2008.02.23 [링크] IBM Java theory and practice: 퍼포먼스
  30. 2008.02.23 [링크] 썬의 collection 관련 튜토리얼
자바의 GC 방식에는 여러가지가 있지만,
최근에 나온 기술에는 G1이라는 것이 있다.
최근에 나온 JDK 6.0 update 14에는 early access 로 G1을 사용할 수 있도록 했다.
G1을 적용하기 위해서는 java start option에
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
라고 명시해 주면 된다.

추가로 G1을 사용할 때 GC로 인한 최대 대기시간을 지정하기 위한
-XX:MaxGCPauseMillis=<X>
옵션을 추가할 수 있으며,
-XX:GCPauseIntervalMillis=<X>
옵션을 통해서 GC 대기 사이의 간격을 지정할 수 있다.
그런데 여기서 중요한 것은
이 옵션은 Goal 이다. Promise나 guarantee 가 아니라는 것이다.
(목표일 뿐이고, 이건 약속이나 보장한다는 것이 아닐 뿐이고~~)

G1이 다른 GC와 다른 것은 GC를 담당하는 New와 Old의 장벽이 사라졌다는 것~~~
자세한건 아래 링크의 비됴나 문서를 함 보시길~~~

Sun Tech Days 2008-2009 자료 보기
http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-5419&yr=2008&track=javase


Posted by tuning-java
,
GC가 뭔지 잘 모르시는 분들은 제 블로그의 다른 글을 찾아보시거나,
"자바 성능을 결정 짓는 코딩 습관과 튜닝 이야기"를 참조하시길...

자바의 메모리 구조는 다음과 같이 되어 있다.
  • Code Cache: contains memory used for compilation and storage of native code
  • Eden Space: pool from which memory is initially allocated for most objects
  • Survivor Space: pool containing objects that have survived Eden space garbage collection
  • Tenured Gen: pool containing long-lived objects
  • Perm Gen: contains reflective data of the JVM itself, including class and memory objects
  • Perm Gen [shared-ro]: read-only reflective data
  • Perm Gen [shared-rw]: read-write reflective data

    아래는 GC를 어떻게 튜닝하는지에 대한 자세한 설명이 있는 사이트 링크다.
    http://java-monitor.com/forum/showthread.php?t=30

    이것도 귀찮은 분을 위해서 더 간단한 튜닝 정보
    http://developer.amd.com/documentation/articles/pages/4EasyWaystodoJavaGarbageCollectionTuning.aspx

    완벽한 GC의 방식과 처리에 대한 자세한 정보를 보려면 아래 링크에 있는 PDF 파일을 참조하는 것도 좋다.
    http://www.cecmg.de/doc/tagung_2007/agenda07/24-mai/2b3-peter-johnson/index.html


    한글로 된 설명을 보고자 하신다면
    다시한번 말씀드리지만,
    "자바 성능을 결정 짓는 코딩 습관과 튜닝 이야기"를 참조하시길...
    지금 생각해보면 이 책에 이 부분에 대한 설명을 좀 약하게 적었다는 생각이 많이 들긴 한다.
    다음책에선 자세히 적어놔야지...

    추가로 Java 6 GC 튜닝 방법에 대한 Sun의 자료는 아래와 같다.
    http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

  • Posted by tuning-java
    ,
    오늘 팀장님께서 복사한 문서를 한번 읽어 보라고 주셨다.
    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
    Posted by tuning-java
    ,
    http://regexp.resource.googlepages.com/analyzer.html

    웹기반의 정규 표현식을 분석해주는 툴이 있어서 소개한다.

    정규 표현식을 서비스에 적용하기 전에,
    한번정도는 체크해 주는 쎈쑤~~~
    Posted by tuning-java
    ,

    기본적으로 자바는 Process와 Thread로 구성되어 있다.

    이게 뭔지는 Java 성능을 결정짓는 코딩 습관과 튜닝 이야기라는 책에 잘 나와 있고...


    여하튼.. 어떤 Thread가 뭔 짓을 하고 있는지를 보려면 Thread dump를 보면 된다.

    자바는 기본적으로 Thread dump를 제공하기 위해서 jstack이라는 명령어(프로그램)을 제공하며 자세한 설명이 필요한 분은 아래의 설명을 보기 바란다.

    http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html

    http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html

     

    만약 JDK 버전이 5.0이면

    Jstack pid

    JDK 버전이 6.0 이면

    jstack -l pid

    명령을 수행하면 된다.


    만약 솔라리스나 리눅스에서 이 명령으로 수행이 안되면

    jstack -F pid

    로 수행하면된다.


    여기서 pid 는 프로세스의 id다.

    만약 jstack이 수행하는데 너무 오래 걸리고, 서버에 부하가 된다면 kill -3으로 쓰레드 덤프를 뜨는 것도 도움이 된다.


    분석하는 방법은 쉽지 않지만 다음과 같은 툴들이 있다.
    TDA라는 툴
    https://tda.dev.java.net/

    IBM의 JCA라는 툴

    http://www.alphaworks.ibm.com/tech/jca



    Posted by tuning-java
    ,

    한빛미디어에서 이벤트를 한다고 하길래 한번 어떤 순서로 공부를 해야 하는지를 정리해본다.

    먼저 이벤트 관련 설문 내용

    1. 현재 하시는 일은 무엇인가요?

    글쎄요. 저도 제가 요즘 뭘 하는지... 그냥 요즘은 수명업무 하고 있습니다. 

    2. 로드맵에서 각 단계별로 같이 보면 좋은 책이 있나요?

    이 질문의 요지는 잘 모르겠지만, 같이보면 좋은 책은 같이 나열 했습니다. ^^;

    3. 로드맵에 대한 자신의 생각을 적어주세요.

    로드맵을 작성하다보니, 웹기반 시스템을 만들 개발자에겐 어느정도 도움이 되는 책들이 많으나, 서버 모듈이나 Core 모듈을 개발하는 개발자용 책은 그리 많지가 않은거 같네요.


    먼저 이벤트 페이지에 올라와 있는, 책들의 표지 목록을 보니 “엄청나게 많은 종류의 책이 출판되고 있구나” 라는 사실을 알게되었다. 그것도 IT 책만을 전문적으로 출판하는 회사에서…

    그런데, 표지 목록에 있는 책들을 보니, 이미 절판된 책도 있는 것으로 보였다. 최대한 내가 알고 있는 절판 책들은 뺐으나, 이 목록에 포함되었을 수도 있으니 이점 양해해 주기 바란다.

    추가로 이 로드맵은 웹 시스템 개발자를 위한 로드맵이고, 내 개인적인 의견이며, 사람마다 생각이 틀릴 수도 있다는 점을 이해해 주기 바란다.

     

    그럼 이제 시작한다.

    자바를 배우기 시작할 때에는 가장 먼저 자바의 기본과 알고리즘을 알아야 한다. 게다가 IDE 사용법까지…

     

    기본적인 자바에 대해서 알았다면, 웹 개발을 위한 필수인 HTML과 자바 스크립트에 대해서 알아야 한다.

     

    그리고, DB에 대해서 알아야 한다는 것은 두말할 필요도 없다.

     

    DB까지 공부했다면, 본격적으로 Java를 이용한 웹 개발 환경인 JSP, Servlet, EJB 에 대해서 알아 두자.
    (참고로 EJB는 죽었다고 생각 될 수도 있지만, EJB에서 제공하는 보안, 트랜젝션등의 관리 기술에 대해서는 알아두는 것이 나중에 정신 건강을 위해서 매우 좋다. ^^)

     

    이게 끝이라고 생각할 수도 있겠지만, 이제 시작이닷!!!

    언제까지 누가 모델링해준 것만 보고 만들것인가? 직접 자기가 모델링하고 설계할 수 있어야 한다.

    그러기 위해선 UML, CBD(이것도 한물 갔다고 생각할 수 있지만, 개념은 알아야한다.), SOA(이것에 대한 책이 한빛엔 없어보인다)등에 대해서 알아야지…

     

    보다 더 제대로 알고 개발하기 위해선, XML, 쓰레드, IO, 네트워킹, 리펙토링 정도는 공부해야 한다. 다른건 다 모르더라도 리펙토링은 반드시~~~~

     

    그 다음엔, 요즘에 많이 사용되는 프레임웍과 Web 2.0, AJAX에 대해서도 공부해야 한다.
    참고로 아래에 나와 있는 책들의 버젼은 내가 잘 모르며, 특히 프레임웍 책을 살 때에는 요즘 최신 버젼의 프레임웍인지에 대해서 잘 알아 본 후에 구입해야 한다. 버젼에 따라서 달라지는게 많아지기 때문에…

     

    그럼 이제 개발한 것을 운영 서버에서 컴파일하거나 올려야 겠죠?

    리눅스나 유닉스의 기본 명령어 정도는 알아야 한다.

     

    마지막으로 개발의 꽃인 튜닝에 대해서 공부하자.

     

    물론 나도 여기에 있는 모든 책을 읽은 것은 아니다.
    하지만, 입맛에 맞게 골라서 Java 기반의 웹 개발에 대한 기본을 튼튼히 다지자.

    Posted by tuning-java
    ,

    http://java.sun.com/javaone/sf/2008/articles/rockstar_tonyprintezis.jsp

    먼저 위의 인터뷰 내용을 읽어보자.
    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

    글 중간에는 다음의 내용을 읽어보라고 이야기한다.
    GC와 친해지는 코딩 방법
    http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2906.pdf

    그리고, 저 이너뷰 한 사람이 사진을 잘 찍는가본데, 사진과 개발과의 상관관계를 아래와 같이 이야기 했다.
    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
    란다.

    더 자세한 내용을 보시려면 아래의 영어지만, 쉽지 않은 용어로 되어 있는 문서를 참조하기 바란다.
    http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf

    참고로 G1은 JDK 7 부터 추가된단다.
    그리고, early access 로 JDK 1.6.1에서 추가 되었다.
    http://www.tuning-java.com/272

    Posted by tuning-java
    ,
    http://performance.netbeans.org/

    근데 이 글들은 NetBeans를 보다 빨리 사용하기 위한 설명들인감?
    Posted by tuning-java
    ,

    http://java.sun.com/performance/reference/whitepapers/tuning.html

    썬에서 제공하는 자바 튜닝 whitepaper

    물론 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

    8.1   Feedback
    8.2   Java Performance Community

    Posted by tuning-java
    ,
    Java의 Runtime이라는 클래스가 있다.

    이 클래스를 사용하면, shell script 던지, exe 파일이던 어떤 실행파일이라도
    자바 JVM에서 실행시킬 수 있다.

    그런데, 정상적으로 잘 실행되면 걱정이 없는데,
    CreateProcess error=2
    를 떨어뜨리면서 실행이 가끔 안될 때가 있다.

    그럴땐 아래의 링크를 참조해서 해결하기 바란다.

    http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
    Posted by tuning-java
    ,
    자바에서 public, protected, private, 그리고, 아무것도 지정하지 않을 때의 차이점도 가끔 혼동될 때가 있다.

    물론 public 이나 private 갖고 혼동하는 사람은 없겠지만...

    protected는 자기 자신과 같은 패키지, 그리고 상속관계에 있는 클래스에서 접근이 가능하고,

    아무것도 명시하지 않을 경우에는 자기 자신과 같은 패키지에서만 접근 가능하다.

    그래서 접근 가능성은
    public > protected > 아무것도 지정하지 않을 때 > private 순이다.

    Posted by tuning-java
    ,
    자바를 처음 배울때 혼동되는 것중 하나가 equals를 언제 사용해야 하고, ==을 언제 사용해야 하는지에 대해서다.

    영어를 잘 하시는 분은 아래의 링크를 읽어보시면, 자세한 내용을 확인할 수 있을 것이다.

    http://www.javabeat.net/qna/13-what-is-difference-between-equals-and-/

    http://leepoint.net/notes-java/data/expressions/22compareobjects.html

    결론만 이야기하면, equals는 객체의 값을 비교하고, ==은 동일한 객체인지를 비교하는 것이다.

    기본적으로 String 클래스만 값이 같은지를 비교하고, 여러분들이 만든 클래스는 자동으로 각 속성들을 비교해주지 않기 때문에, equals() 메소드를 직접 구현해야만, equals로 비교가 가능하다.

    Posted by tuning-java
    ,
    http://dlc.sun.com/pdf/819-3681/819-3681.pdf

    문서의 제목은 Sun Java SystemApplication Server 9.1 PerformanceTuning Guide라고 되어 있다.

    하지만, 실제 내용은 특정 Application 서버에 한정된 내용이 아닌 범용적이고, 기본적인 이야기가 많이 정리되어 있다.

    세부적인 내용은 아니더라도, 제목만이라도 읽어 놓으면 많은 도움이 될 듯 하다.

    바로 다운로드 받기 귀찮은 분들은 아래의 내용을 펼쳐서 제목만이라도 읽어보기 바란다.

    Posted by tuning-java
    ,
    1999년도에 내가 자바를 배울때의 개발툴은 Ultra Edit 이었다.
    지금도 울트라 에딧은 자바만이아닌 여러 언어의 최고의 개발 툴이다.

    하지만 현재 가장 많이 사용되는 툴은 누가 뭐래도 eclipse 일 것이다.
    이클립스를 다운로드 받으시려면, 검색엔진에서 www.eclipse.org 에 접속후 상단에 있는 Download를 선택하여,
    원하는 것을 받으면 되는데, 자바 기반의 웹 어플리케이션을 개발할 경우에는 아래의 그림에서 가장 첫번째 이클립스를...
    그렇지 않은 경우에는 그 아래에 있는 이클립스를 다운 받으면 된다.


    추가로 이클립스 이외에 유명한 툴로는 Sun 에서 제공하는 NetBeans라는 툴이 있긴 한데,
    약간 프로그램이 무거워서 많은 사람들이 애용하지는 않는다.

    그리고, 개인적으로는 예전에 세미나 하면서 무료로 받은 IntelliJ라는 툴을 사용할 때도 있는데,
    아직까지는 이클립스보다는 좋은 툴 같다.(상용이라는게 좀 흠이지만...)


    다음에는 equals와 == 에 대해서 알아보도록 하겠다.
    Posted by tuning-java
    ,

    먼저 JVM이 뭔지 알아보자.

    JVM은 Java Virtual Machine의 약자로 한국말로하면 자바 가상 머신을 의미한다.

    쉽게 말하면 자바로 만들어진 클래스 파일을 번역해서 수행하는 소프트웨어라고 생각하면 된다. 자세한 내용은 아래 링크를 참조하면 된다. (JVM의 스펙에 대한 내용이라 열나 어렵긴 할 것이다.)

    http://java.sun.com/docs/books/jvms/


    그렇다면Hotspot은 뭘까 ??? 

    Hotspot은 VM의 한 종류라고 보면된다. 이게 나오기 전의 VM을 보통 클래식 VM 이라고 부르며, Hotspot에 대해서 한 마디로 설명하면 다음과 같다.(출처 : http://kr.sun.com/software/opensource/faq.html#b11)

    Q :
    자바 HotSpot 가상머신은 무엇이고, 개발자들은 이 컴포넌트로 무엇을 할 수 있나요?
    A :
    자바 HotSpot은 일종의 자바 가상머신의 구현으로, 자바 HotSpot VM에는 다음과 같은 자바 플랫폼을 위한 핵심 실행 엔진이 포함됩니다:
    • 자바 바이트코드를 지원 하드웨어 플랫폼 상에서 최적화된 네이티브 기계어 코드로 변환하는 동적 컴파일러
    • 메모리 관리 및 가비지 컬렉션 서브시스템
    • 스레드 및 동기화
    • 모니터링, 디버깅, 프로파일링 텔레메트리(profiling telemetry)
    • 바이트코드 검사기(bytecode verifier)를 포함한 자바 보안 아키텍처 부분들

    HotSpot은 그 자체가 “일단 한번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)”라는 자바 기술의 약속을 가장 구체적으로 실현한 Java SE 플랫폼 컴포넌트라 할 수 있습니다.

    개발자들은 이 코드를 통해 세계 최고 수준의 가상머신이 어떻게 구축되는지 살펴볼 수 있을 뿐 아니라, 버그 픽스, 그리고 새로운 가비지 컬렉션, 동기화, 바이트코드 컴파일러 알고리즘의 테스트, VM을 새로운 하드웨어 아키텍처와 운영체제에 이식하는 등의 작업을 수행할 수 있게 됩니다.


    Hotspot 에 대해서는 아래 링크를 참조하는 것이 가장 쉬울 것이다.

    http://java.sun.com/javase/technologies/hotspot/index.jsp

    그리고, Hotspot  VM을 튜닝하기 위한 옵션은 아래의 링크를 참조하면 된다.

    http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

    다음에는 개발툴에 대해서 알아 보자.

    Posted by tuning-java
    ,
    http://2005elc.elancer.co.kr/eTimes/page/eTimes_list.html?cstr=Q0FURUNPREU9QTEwMDAxNTAw

    자바 성능 튜닝은 JVM 옵션만 튜닝한다고 해서 되는 것은 아니다.

    하지만, Application 단에서 튜닝을 모두 마쳤을 경우 가장 마지막에 해야 하는 것이
    JVM의 GC 옵션 및 메모리 부분의 튜닝이다.

    물론 사람에 따라 방식이 틀려서 GC 옵션을 처음부터 할 수도 있다.
    Posted by tuning-java
    ,
    kenu님 미투데이에 놀러갔다가 ehcache 를 발견했다.

    간단히 사용법을 정리한 블로그는 영어지만,
    http://blog.cherouvim.com/caching-pages-using-ehcache


    ehcache는 홈페이지에서 다운로드 가능하다.
    http://ehcache.sourceforge.net 

    왜 페이지 캐시가 필요한지는 대부분 아시겠지만,
    예를 들어서 간단하게 말씀드리면...
    온라인 쇼핑몰에서 대분류, 중분류, 소분류로 상품의 목록이 나오고
    해당 상품의 개수가 나와있다고 가정해보자.
    만약 이런 페이지의 캐시를 지정하지 않았다면, 페이지를 호출할 때마다 해당 카테고리의 상품 개수를 가져오는 쿼리가 계속 수행될 것이다.

    그런데 캐시를 사용한다면???
    거의 HTML을 읽어오는 속도로 메모리에서 데이터를 읽어 올 수 있으므로,
    해당 화면이 엄청나게 자주 불리는 초기화면이거나 include되는 화면이라면 WAS 와 DB 사용량이 현저하게 줄어들 수 있다.
    추가로 I/O 도 줄어들 수 있을 것이다.
    Posted by tuning-java
    ,
    자바라는 단어만 들어도 스트레스를 받는 분들이 가끔 계신것 같습니다.

    특히 경력이 10년 넘으신 분들 중 서버나 DB, 네트웍만 하신 분이나
    C나 Cobol만을 하신 분들은 쉽게 접근하기가 어려운게 현실이지요.

    그래서 오늘부터 틈틈이 자바의 ㅈ, Java의 J 도 모르시는 분들이 쉽게 자바를 배울 수 있도록
    강좌를 개설하려 합니다.

    자바 기본 문법은 그리 상세히 다루지 않을 겁니다.
    그런건 책에 잘 나와 있으니까요.
    가장 추천하는 책은 Head First Java 입니다.
    http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=1809610&CategoryNumber=001001003016
    올해는 어떨지 모르겠지만, 작년까지만 해도 삼성SDS 신입사원 자습 교재였습니다.


    고급 개발자분들, 저보다 똑똑하신분, 심장이 너무 약하신분들은 절대로 이 글을 보지 마세요.
    그런분들이 거신 별 도움 안되는 딴지는 과감히 삭제하겠습니다. ^^;

    그럼 시작하겠습니다.

    기본적인 이해를 돕기 위해서 용어부터...
    - JDK와 JRE
    http://java.sun.com/
    를 접속해 보세요.
    (물론 영업니다. 영어에 울렁증이 있으셔도 그냥 따라가 보세요.)
    상단 메뉴에 있는 Downloads를 눌러보세요. 갖다 대기만 해도 뭐 여러 목록이 나타나는데 일단 그냥 누르세요.


    그림과 같은 화면이 나타날겁니다. 만약 이런 화면이 나타나지 않았다면, 웹사이트 접속부터 다시...
    열나 종류가 많은데 왼쪽것만 보세요.

    가장 위 부터 개발툴, Java EE, Java ME, Java SE, JavaFX,Database 가 있습니다.
    개발 툴은 말 그대로 썬에서 맹글고 밀고 있는 개발 툴이 있지요.
    가장 대표적인 Sun Studio와 NetBeans가 있는데, 이것들은 많은 사람들이 사용하고 있지 않은 SWING이라는걸 사용해서 맹근겁니다. 그래서 화면이 좀 우울하죠.

    그렇다면 많이 쓰는 Eclipse 는? 그건 Sun에서 맹그는게 아니라 IBM이랑 여러 회사가 같이 연합해서 맹그는 겁니다.
    eclipse에 대해서 자세히 알아보시려면 http://www.eclipse.org 에 들어가서 보시면 됩니다.
    URL이 org 이기 때문에 말 그대로 비 영리조직입니다. 그래서 꽁짜로 나누어 주는 겁니다.

    그 다음에 있는 Java EE 라는게 있죠?
    여기서 EE는 Enterprise Edtion 의 약자로, PC나 클라이언트를 위한 어플리케이션이 아닌 Web이나 기업용 시스템을 개발하기 위한 환경을 제공해 줍니다. 일단 여러분은 Pass...

    Java ME 는 Micro Edtion에 대한 약자로 모바일을 위한 개발 환경을 제공합니다.
    근데 뭐 여러분들에겐 별 도움이 안되겠죠?

    그 다음이 Java SE 입니다. 일단 딴거 먼저 설명드리고 이거에 대한 설명을 다시 드리겠습니다.

    JavaFX 는 Flash (요즘은 FLEX라고 많이 알려져 있는) 나 MS의 Silverlight 와 같이 브라우져 화면에서 좀더 화려하고 예쁜 화면을 제공하는 거 라고만 생각하고 계시면 되겠습니다.
    나온지 꽤 되었는데, 아직 실무에 적용하긴 거시기한 상태입니다.

    Database는 JavaDB라는 Java기반의 DB(아직 이거에 대해서는 공부를 안해서 잘 모르지만 언제부턴가 JDK를 깔면 같이 깔립니다.)와 Sun이 구매해버린 mySql 을 여기서 다운로드 할 수 있습니다.

    이제 Java SE를 링크에서 확장해서 가장 위에 있는 Java SE (JDK) 를 클릭해 봅시다.
    여러가지 다운로드 링크가 있는데, 기본적으로 다음과 같은 것들이 있지요.
    Java SE Runtime Environment.....
    Java SE Development Kit .....
    .....
    나머지는 모르셔도 되구요.
    여기서 맨 위에 있는 것이 바로 JRE 이고,
    두번째 있는 것이 JDK(JSDK)

    JRE가 하는 일은 http://java.sun.com/javase/6/webnotes/install/jre/README 를 참조하시면 됩니다.
    한마디로 자바를 실행할 수 있는 환경만을 제공합니다.
    이것만 다운로드 받으면 개발은 불가능하다~~~
    라고 생각하시면 됩니다.

    JDK는 말 그대로 개발 킷입니다.
    .java로 만든 텍스트 기반의 파일을 .class 라는 바이너리 타입의 파일로 컴파일 하는 일도 하고,
    각종 모니터링 기능 및 분석기능 등등 여러가지 개발에 필요한 킷들을 제공합니다.

    쓰다보니 글이 길어졌네요.
    다음에는 JVM이 뭔지에 대해서 설명해 드리겠습니다.

    PS : 이 강좌가 작성되는 주기는 일정하지 않습니다.


    Posted by tuning-java
    ,
    http://www.j2eestudy.co.kr/lecture/lecture_read.jsp?table=j2ee&db=lecture0201_1&id=24

    금일 세미나 수강생중 한분이 쓰레드 덤프를 어떻게 분석하는지에 대한 질문을 하셔서,

    관련 자료를 찾다가 가장 적절한 내용이기에 링크를 정리해 둔다.

    조대협님이 정리하신 내용인데,
    정말 상세하고 잘 되어 있다.

    근데...

    개발자 분들은 직접 분석하려고 하는 것 보다는,
    WAS 엔지니어나 서버 엔지니어 분들께 분석을 요청 드리는 것이
    가장 빠르고, 현명하고, 간편하고, 머리 안아픈 방법이라는 것을 명심해 주기 바란다.
    Posted by tuning-java
    ,
    http://ukja.tistory.com/category/Enterprise%20Java

    이 글을 작성하신 분께서는 JVM 떄문에 단단히 고생하신것 같다. ^^;

    제 책에 있는 메모리 부분에 대한 설명을 읽은 후 이 블로그에 있는 글을 읽으시면 굉장히 많은 도움이 되겠네요.

    특히 IBM JVM의 가장 큰 문제인 Compaction 문제에 대해서도 정리가 잘 되어 있다.
    Posted by tuning-java
    ,
    http://www.ibm.com/developerworks/kr/library/au-javaonaix_memory.html

    AIX 서버 (IBM JVM을 사용하는 서버)에서 자바 관련 문제가 발생되었을때 해결방안이 정리되어 있다.

    그중 가장 마음에 드는 구절은 다음 부분이다. ^^;

    메모리 문제는 매우 복잡하고, 해결하기도 매우 어려우며, 진단에도 많은 시간이 요구됩니다. 메모리 관련 문제들은 다음과 같은 이유로 인해 해결하기 매우 어려운 작업입니다.

    • 부적절하게 튜닝 된 OS나 JVM
    • 부적절하게 객체를 관리하는 자바 애플리케이션
    • 부적절하게 할당된 큰 객체 또는 중첩 객체들
    • 단편화(Fragmentation)
    • JNI/네이티브 코드에서 올바르게 릴리스 되지 못한 메모리
    • JVM 메모리 할당과 사용에 대한 이해의 부족

    ㅋㅋㅋ

    Posted by tuning-java
    ,

    http://www.jennifersoft.com/46/forum/page/3/show/1130.html

    메모리 릭을 발생시키는 원인은 무척 많지만,
    Oracle의 OCI를 사용할때 C Heap이 계속 누적되어 OutOfMemoryError가 발생할 수 있다고 한다.

    데이터 건수가 적을때는 조금씩 쌓여도 간에 기별도 안가겠지만,
    화면에서 제대로 처리하지 못하고 3만, 10만건을 조회하다가 오류가 발생하면 이러한 문제가 발생할 수도 있다.


     

    Posted by tuning-java
    ,
    http://java.sun.com/j2se/javadoc/writingdoccomments/

    자바로 개발하다 보면, 주석을 잘 정리하지 않는 경우가 있는데
    -나중에 내가 이 메소드를 왜 만들었는지,
    -무슨 역할을 하는 클래스인지
    를 기억 못하는 경우가 종종 있다.

    그리고 추후에 Java doc 문서를 만들때 필요한 요소들을 모르면 제대로 된 문서가 생성되지 않는다.

    위에 있는 링크를 참조하여, 반드시 자신의 클래스에 주석을 다는 버릇을 들이자.
    특히 이 버릇은 정말 고치기 힘들다.

    참고로 eclipse에서는 comment를 달기 위해서 해당 메소드나 클래스의 블록 안에서 Alt+Shift+J 를 누르면, 기본적인 주석이 생성된다.

    public class A {
      //지점 1
      public void methodB () {
        //지점 2
      }
    }

    즉 지점 1에서 단축키를 누르면 클래스의 주석이 자동 생성되고,
    지점 2에서 단축키를 누르면 메소드의 주석이 자동 생성된다.
    Posted by tuning-java
    ,

    자바 API에 있는 java.util.regex 패키지의 Pattern 클래스를 보면 정규식을 표현하는 Construct가 나와 있다.
    http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

    아래 내용은 Java JDK에 있는 내용을 재 정리 한것이다. (시간이 되면 번역을 할까 생각중인데, 궂이 그럴필요가...)

    가장 먼저 특수 문자에 대해서 알아보자. 각각의 8진수, 16진수, tab, 이스케이프 문자등을 나타내기 위해서는 다음과 같이 사용하면 된다.

    x The character x
    \\ The backslash character
    \0n The character with octal value 0n (0 <= n <= 7)
    \0nn The character with octal value 0nn (0 <= n <= 7)
    \0mnn The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7)
    \xhh The character with hexadecimal value 0xhh
    \uhhhh The character with hexadecimal value 0xhhhh
    \t The tab character ('\u0009')
    \n The newline (line feed) character ('\u000A')
    \r The carriage-return character ('\u000D')
    \f The form-feed character ('\u000C')
    \a The alert (bell) character ('\u0007')
    \e The escape character ('\u001B')
    \cx The control character corresponding to x

    그 다음에는 문자를 표현하는 방식을 보자. 특정 범위의 문자나 범위 이외의 문자는 다음과 같이 표시한다.

    [abc] a, b, or c (simple class)
    [^abc] Any character except a, b, or c (negation)
    [a-zA-Z] a through z or A through Z, inclusive (range)
    [a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
    [a-z&&[def]] d, e, or f (intersection)
    [a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
    [a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)

    위의  방식을 사용하여 정의할 수도 있겠지만, 다음과 같이 미리 정의된 문자열을 사용하면 보다 편하게 사용 가능하다.

    . Any character (may or may not match line terminators)
    \d A digit: [0-9]
    \D A non-digit: [^0-9]
    \s A whitespace character: [ \t\n\x0B\f\r]
    \S A non-whitespace character: [^\s]
    \w A word character: [a-zA-Z_0-9]
    \W A non-word character: [^\w]

    그리고, POSIX 문자열을 사용할 경우에는 다음과 같이 정의할 수 있다.
    (참고로 POSIX가 뭔지 모르시는 분은 http://ko.wikipedia.org/wiki/POSIX 를 참조하시면 쉽게 이해 될것이다.)

    \p{Lower} A lower-case alphabetic character: [a-z]
    \p{Upper} An upper-case alphabetic character:[A-Z]
    \p{ASCII} All ASCII:[\x00-\x7F]
    \p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]
    \p{Digit} A decimal digit: [0-9]
    \p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]
    \p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    \p{Graph} A visible character: [\p{Alnum}\p{Punct}]
    \p{Print} A printable character: [\p{Graph}\x20]
    \p{Blank} A space or a tab: [ \t]
    \p{Cntrl} A control character: [\x00-\x1F\x7F]
    \p{XDigit} A hexadecimal digit: [0-9a-fA-F]
    \p{Space} A whitespace character: [ \t\n\x0B\f\r]

    자바의 Character 클래스와 같은 방식으로 사용하려면 다음과 같이 사용 가능하다.

    \p{javaLowerCase} Equivalent to java.lang.Character.isLowerCase()
    \p{javaUpperCase} Equivalent to java.lang.Character.isUpperCase()
    \p{javaWhitespace} Equivalent to java.lang.Character.isWhitespace()
    \p{javaMirrored} Equivalent to java.lang.Character.isMirrored()

    유니코드를 처리하기 위해서는 다음과 같이 사용하면 된다. (한글에 대해서는 아직 테스트 해보지 않았다. ^^)

    \p{InGreek} A character in the Greek block (simple block)
    \p{Lu} An uppercase letter (simple category)
    \p{Sc} A currency symbol
    \P{InGreek} Any character except one in the Greek block (negation)
    [\p{L}&&[^\p{Lu}]]  Any letter except an uppercase letter (subtraction)

    각 경계값을 나타내는 것은 다음과 같이 할 수 있다.

    ^ The beginning of a line
    $ The end of a line
    \b A word boundary
    \B A non-word boundary
    \A The beginning of the input
    \G The end of the previous match
    \Z The end of the input but for the final terminator, if any
    \z The end of the input

    이제부터 정신을 바짝 차려야 하는데, 위의 각 방법을 조합해서 각 문자의 횟수를 다음과 같이 지정할 수 있다.
    (이를 Greedy quantifiers라고 부른다.)

    X? X, once or not at all
    X* X, zero or more times
    X+ X, one or more times
    X{n} X, exactly n times
    X{n,} X, at least n times
    X{n,m} X, at least n but not more than m times

    그리고, ? 와 +를 사용하여 각각 제외 및 포함의 의미를 나타낸다. 각 예는 다음과 같다.

    Reluctant quantifiers
    X?? X, once or not at all
    X*? X, zero or more times
    X+? X, one or more times
    X{n}? X, exactly n times
    X{n,}? X, at least n times
    X{n,m}? X, at least n but not more than m times

    Possessive quantifiers
    X?+ X, once or not at all
    X*+ X, zero or more times
    X++ X, one or more times
    X{n}+ X, exactly n times
    X{n,}+ X, at least n times
    X{n,m}+ X, at least n but not more than m times

    논리 부분은 다음과 같이 표시한다.

    XY X followed by Y
    X|Y Either X or Y
    (X) X, as a capturing group

    특수 Construct는 다음과 같다.

    (?:X) X, as a non-capturing group
    (?idmsux-idmsux)  Nothing, but turns match flags i d m s u x on - off
    (?idmsux-idmsux:X)   X, as a non-capturing group with the given flags i d m s u x on - off
    (?=X) X, via zero-width positive lookahead
    (?!X) X, via zero-width negative lookahead
    (?<=X) X, via zero-width positive lookbehind
    (?<!X) X, via zero-width negative lookbehind
    (?>X) X, as an independent, non-capturing group

    기타 관련 Construct들은 다음과 같다.

    Back references
    \n Whatever the nth capturing group matched

    Quotation
    \ Nothing, but quotes the following character
    \Q Nothing, but quotes all characters until \E
    \E Nothing, but ends quoting started by \Q

    이 내용들에 대해서는 한번 쭉~~~ 읽어보면 이해가 되겠지만, 예제를 봐야지만 보다 더 쉽게 이해할 수 있으리라 생각된다.

    다음 글에는 예제를 통해서 각 Regular Expression을 어떻게 사용하는지 정리하도록 하겠다.

    Posted by tuning-java
    ,

    String 데이터를 처리하기 위한 코딩을 할 때 알아두면 굉장히 도움 되는 것이 Regular Expression이다.

    이게 뭔지도 모르신다면, 아래의 링크를 따라가서 한번 읽어 보시기를 권장한다.

    http://java.sun.com/docs/books/tutorial/essential/regex/index.html

    예를 들어 e-mail 주소나 URL의 정합성을 체크할 때 굉장히 편하게 사용할 수 있다.
    Regular Expression을 주로 사용하는 언어들은 grep, Perl, Tcl, Python, PHP, awk 등이 있다.

    Java 에서도 JDK 1.4 버젼부터 Regular Expression을 사용하기 시작했으며, java.util.regex.Pattern 클래스의 API 를 보면 Regular Expression에서 사용되는 패턴 구성을 볼 수 있다.

    참고로,이미 만들어진 Regular Expression 들을 참조하고 싶다면, 아래의 사이트를 방문하기 바란다.
    http://regexlib.com/

    그럼 간단하게 Java를 이용해서 Regular Expression을 사용하는 방법에 대해서 알아보자.

    import java.util.Scanner;
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;

    public class RegexTester {

        public static void main(String[] args){
            RegexTester rt=new RegexTester();
            while(true) {
                rt.checkRegularExpression();
            }
        }
        public void checkRegularExpression() {       
            Scanner sc=new Scanner(System.in);
            System.out.print("Enter Regular expression pattern : ");
            String regex=sc.nextLine();
            while(check(regex));
        }
        public boolean check(String regex) {
            Scanner sc=new Scanner(System.in);
            System.out.print("Enter data: ");
            String data=sc.nextLine();
                Pattern samplePattern = Pattern.compile(regex);
                Matcher matcher = samplePattern.matcher(data);
                boolean found = false;
                while (matcher.find()) {
                    System.out.format("Text \"%s\" is found : from index %d - to index %d.\n",
                        matcher.group(), matcher.start(), matcher.end());
                    found = true;
                }
                if(!found){
                    System.out.format("No match found.\n");
                }
                System.out.print("Check another data ? [Y or y] or Quit [Q or q] : ");
                String another=sc.nextLine();
                if(another.equals("Q") || another.equals("q")) {
                    System.exit(0);
                    return false;
                } else if(another.equals("Y") || another.equals("y")) {
                    return true;
                } else {
                    return false;
                }
        }

    }

    이 프로그램은 Regular Expression을 입력하고, 문자열을 입력하면 입력된 문자열중 Regular Expression과 맞는 (match되는) 문자열이 어떤것이 있는지를 화면에 뿌려준다.

    실행 결과 예는 다음과 같다.

    Enter Regular expression pattern : [abc]
    Enter data: abcdefg
    Text "a" is found : from index 0 - to index 1.
    Text "b" is found : from index 1 - to index 2.
    Text "c" is found : from index 2 - to index 3.
    Check another data ? [Y or y] or Quit [Q or q] : y
    Enter data:
    No match found.
    Check another data ? [Y or y] or Quit [Q or q] : y
    Enter data: cbfhgft
    Text "c" is found : from index 0 - to index 1.
    Text "b" is found : from index 1 - to index 2.
    Check another data ? [Y or y] or Quit [Q or q] : q

    다음 글에는 Regular Expression을 어떻게 지정하는지 알아보자.

    Posted by tuning-java
    ,
    자바의 어노테이션이란 것이 JDK 5.0 부터 생겨났기 때문에,
    예전부터 자바를 하신분들은 이해하기가 다소 어려울 수 있다.
    그럼 어노테이션이란건 왜 만들어서 사람을 귀찮게 할까 ?
    궁금하다면, 다음의 글을 읽어보자.
    (참고로 한글이다....)

    http://www.ibm.com/developerworks/kr/library/j-annotate1/index.html


    http://www.ibm.com/developerworks/kr/library/j-annotate2.html
    Posted by tuning-java
    ,
    http://java.sun.com/docs/books/tutorial/index.html

    자바 튜토리얼 홈페이지다.

    쉽게 찾을수 있는 페이지가 아니라 링크를 정리해 본다.
    Posted by tuning-java
    ,

    http://www.hp.com/products1/unix/java/infolibrary/prog_guide/hotspot.html#-Xeprof

    HP의 JVM Option이 정리되어 있는 링크이다.

    나중에 유용하게 사용되길...

    Posted by tuning-java
    ,

    http://www.ibm.com/developerworks/kr/library/j-jtp09275.html

    IBM에서 작성한 성능과 관련된 문서.

    Java의 성능과 관련된 내부 구성이 어떻게 되는지를 확인할 수 있는 좋은 문서

    이 사이트는 한글로 구성되어 있기 때문에,

    영어 울렁증이 있는 분들에게도 많은 도움이 될 것이다.

    Posted by tuning-java
    ,
    Posted by tuning-java
    ,