Java Performance Fundamental

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Java Performance Fundamental

그림:JavaPerfFund.jpg


Java Performance Fundamental은 JVM의 체계적인 지식을 제공하여 Java를 사용하는 분들께 성능에 대한 기반지식을 쌓도록 도와드립니다.


이 책에는 지금껏 다루어 지지 않은 JVM의 메커니즘에 대한 이야기로 가득차 있습니다. Java 개발자, 운영자, 성능 관리자들이 골머리를 썩여왔던 메모리 문제, Garbage Collection에 대한 주제는 물론이고 JIT Compiler 등 용어로 치부했던 것들에 대한 자세한 설명이 있습니다.


그리고 JDBC에 대한 설명과 함께 Oracle을 Datasource로 이용하여 SQL을 수행할 때 WAS와 같은 Java Application과 Oracle에는 어떤 일이 벌어지는 지를 테스트를 통해 상세하게 밝혔습니다. 또한 이를 바탕으로 Oracle JDBC의 성능을 개선시키는 방안도 모색하고 있습니다.


이 책은 Java Performance 를 위한 좋은 안내자가 될 것입니다.

[편집] 저자 소개

저자 [김한도]는 자신이 하고 있는 일을 Oracle이나 Java라는 특정 영역으로 한정 짓는 것보다 성능(Performance)이라는 단어로 표현하기를 즐긴다. 그는 Performance Korea 라는 꿈을 실현하기 위해 오늘도 새로운 영역을 탐구하기를 마다하지 않는다. Oracle 성능으로 IT업계에 발을 들여 놓은 저자는 [OWI를 활용한 오라클 진단 & 튜닝]의 번역에 참가하였고, 뒤이어 다년간의 성능 분석의 경험을 체계화 한 [Oracle 성능 분석 방법론]이라는 책을 출간하였다. 그 후 관심 분야를 Java로 옮겨 서비스 기반의 성능을 고민하고 있다. 엑셈은 이러한 저자의 꿈을 실현하는 든든한 버팀목이다. 엑셈과 저자는 꿈을 공유하며 같이 성장하고 있다.

저자는 8년 전 가장 이상적인 배우자를 만나 결혼하였고, 한 아들과 두 딸과 함께 행복하게 살고 있다. 저자는 항상 이야깃거리를 만드는 것도 좋아해 언젠가는 날카로운 풍자가 담긴 재미있는 이야기를 만들겠다는 꿈도 가지고 있다. 그 밖에도 서양의 고전 음악을 좋아하며 틈틈이 틴휘슬과 바이올린을 연습하기도 한다.

블로그 Performance Meister for Enterprise Performance를 통해 저자를 온라인으로 만날 수 있습니다.

저자에게 연락하려면 artdb@ex-em.com으로 Email을 보내시면 됩니다.

트위터로도 만나보실 수 있습니다. 저자의 Twitter ID는 @novathinker 입니다.

[편집] 왜 JVM인가?

Java 성능의 기반을 닦는다고 하면서 왜 JVM이었을까요?

그것은 모든 Java 프로그램이 JVM(Java Virtual Machine) 위에서 동작하기 때문입니다. 당신이 WAS를 사용하든 Applet을 사용하든 Java 언어로 만들어진 프로그램을 수행하기 위해서는 반드시 JVM이 기동되어야 합니다.

그렇기 때문에 Java는 결국 JVM에 종속되어 있게 됩니다. 결국 Java성능은 JVM 레벨에서 시작하기 때문에 JVM에 대한 메커니즘을 이해하는 것이 중요한 것입니다.


JVM은 다 똑같은거 아닌가요?

그렇지 않습니다. OS를 만드는 여러 회사가 있듯 JVM도 여러 회사에서 만들고 있습니다. 우리가 가장 많이 사용하는 Sun사의 JVM이 있고 IBM에서 만드는 JVM이 있습니다. 또한 Oracle에서도 HP에서도 만들고 있습니다. WAS 벤더인 BEA에서도 JRockit이라는 JVM을 만들고 있고 Open 진영에서도 Open JDK, Harmony 등의 JVM이 있습니다. 이에 대한 자세한 정보는 Wikipedia.org의 하단의 리스트를 참고하십시오.

이중 상용 머신에서 가장 많이 사용하는 JVM은 Sun사의 Hotspot JVM과 IBM의 JVM입니다. Hotspot은 원래 JIT Compiler를 개량한 Hotspot Compiler를 사용하면서 붙여진 별명입니다. Hotspot JVM은 Sun, Oracle, HP 등의 벤더에서 모두 사용하고 있기 때문에 책에서도 Hotspot JVM으로 명명하였습니다. 그리고 IBM JVM은 IBM머신에 기본적으로 설치되어 있습니다. IBM이 Java 5에 J9이라고 하는 JVM을 흡수하였기 때문에 J9이라고 부르기도 합니다. 책에서는 IBM JVM으로 명명하고 있습니다.

각 JVM 벤더들은 Sun Solaris, Windows, Linux 머신의 경우 Sun사의 JVM을 탑재하기로 하였고, HP머신은 HP의 JVM을 그리고 IBM의 경우 AIX, OS/2, z/OS 에서 자사의 JVM을 탑재하기로 하여 영역을 구분하였다고 합니다.


아무리 그래도 JVM은 Sun에서 만든게 진퉁아닌가요?

그렇지 않습니다. JVM이란 원래 스펙(Specification)일 뿐 그 구현은 벤더에서 담당합니다. 스펙에 맞게 구현하기만 한다면 해당 버전의 JVM이 되는 것이고 이들은 모두 짝퉁아닌 진퉁입니다.


DB는 알아서 다 해주는 데 굳이 Oracle JDBC성능을 언급할 필요가 있을까요?

예!!! 있습니다. DB는 SQL의 결과에 대해서만 알아서 해주기 때문입니다. Application에서 SQL을 대충 짜서 보내면 DB의 성능이 나빠질 수도 있습니다. 그러나 Tuning된 SQL을 보낸다하더라도 이 결과를 건네주는 JDBC의 역할에 따라 성능이 개선될 여지가 충분합니다.

JDBC는 단지 Java Application과 Database를 연결해 주는 역할만 하는 것이 아니라 데이터가 지나가는 길입니다. 좁은 길에 병목이 생기는 것은 당연하겠지요. JDBC도 마찬가지 입니다. 이 책에서는 우리가 간과하고 있는 성능의 사각지대인 이 JDBC에 대해 다루고 있는 것입니다.

[편집] 주문하기

yes24

InterPark

강컴

알라딘

교보문고

반디앤루니스


[편집] 강좌 소개

엑셈에서는 홀수 달마다 격월로 해당 책에 대한 교육을 진행하고 있습니다.

세미나 교재

[편집] 내용소개

이 책은 크게 두 부분으로 나누어 진다. 한 부분은 JVM Internal이다. 1장 부터 6장에 해당한다. 그리고 7장에서는 JDBC와 Datasource로서 Oracle를 사용할 때의 성능 문제에 대해 다루고 있다.


[편집] 1장. Java란 무엇인가

Java란 무엇이며 JVM은 Java에서 어떠한 의미를 가지고 있는 지에 대해 설명하고 있다.

  • Java Architecture
    • The Java Programming Language
    • The Java Class File Format
    • The Java Application Interface
    • The Java Virtual Machine (JVM)


[편집] 2장. Runtime Data Areas

2장은 JVM의 메모리 구조인 Runtime Data Areas에 대한 설명을 하고 있다. 크게는4개의 모듈로 나누어 지는 Runtime Data Areas를 부분 별로 자세히 다루고 있다. 그리고 나서 우리가 프로그램을 수행할 때 Runtime Data Areas에서는 어떻게 데이터들이 움직이는 지를 간단한 예제를 통해 알아본다.

  • Runtime Data Areas의 구조
  • PC Register
  • Java Virtual Machine Stacks
  • Native Method Stack
  • Method Area
  • Java Heap
  • Runtime Data Areas Simulation


[편집] 3장. Garbage Collection

3장은 Garbage Collection에 대해 설명한다. 먼저 JVM에서 사용하는 Garbage Collection 뿐만 아니라 일반적인 Garbage Collection의 Algorithm을 상세히 알아본다. 그 후 Hotspot JVM의 Heap구조와 Garbage Collector를 설명하고 Generation별로 어떻게 동작하는 지에 대해 설명한다. 이어 IBM JVM에 대한 Heap 구조와 Garbage Collector에 대해서도 설명한다.

  • Garbage Collection 이란?
  • Garbage Collection 의 대상
  • Garbage Collection 의 기본 Algorithm
  • Hotspot JVM의 Garbage Collection
    • Serial Collector
    • Incremental Collector
    • Parallel Collector
    • CMS Collector
    • Parallel Compaction Collector
    • Garbage First Collector
  • IBM JVM의 Garbage Collection
    • Optimize for Throughput Collector
    • Optimize for Pause Time Collector
    • Generational Concurrent Collector
    • Subpool Collector


[편집] 4장. Class Loader

4장은 Class Loader를 다루고 있다. Class Loader란 무엇이고 Class가 어떻게 JVM안으로 들어와 메모리의 일부로 동작하는지에 대해 상세하게 설명하고 있다. 그리고 Java 5에서 새로 소개된 Class Sharing에 대해서도 다루고 있다.

  • Class Loader
    • Namespace
    • Class Loader Delegation Model
    • Class Sharing
  • Class Loader Work
    • Loading
    • Linking
    • Initialization


[편집] 5장. Execution Engine

5장은 Execution Engine에 대한 내용이다. Class파일에 저장되어 있는 Bytecode를 해석하는 방법을 JIT Compiler와 Hotspot Compiler의 동작과정을 통해 자세히 알아본다.

  • Execution Engine
  • IBM JIT Compiler
  • Hotspot Compiler


[편집] 6장. Thread Synchronization

6장은 Thread Synchronization이다. 여기서는 Java에서 Thread라는 것은 어떻게 관리되어 왔으며 동기화는 어떤 역할을 하는지를 설명한다. 더 나아가 JVM의 버전이 올라가면서 추가된 Hotspot JVM의 Biased Lock이나 IBM JVM의 Lock Reservation에 대해서도 설명하고 있다.

  • Java의 Thread
  • Java Synchronization
  • Hotspot JVM Synchronization
  • IBM JVM Synchronization


[편집] 7장. Oracle As DataSource

7장은 처음에는 JDBC에 대한 얘기로 시작한다. 그리고 Oracle JDBC Driver에 대한 설명을 진행하고 여러 Oracle JDBC Driver 중 성능의 차이를 테스트를 통해 알아보게 된다. 그리고 Oracle에서 SQL이 수행될 때 Oracle 내부에서는 어떠한 일이 벌어지는지를 살펴보고, Java에서 SQL을 수행할 때와 어떤 차이가 있는지를 테스트를 통해 비교해 본다. 그리고 나서 JDBC에서 제공하는 여러 튜닝 기능이 어떻게 성능에 영향을 주게 되는지를 테스트한다. 이를 통해 이 기능들이 어느 부분에 얼마만큼의 성능 개선을 하게 되는 지를 실감할 수 있게 된다.

  • JDBC Overview
  • Oracle JDBC Driver
  • Java SQL Execution
  • Java SQL Performance


DB Schema 및 Source Code는 다음과 같습니다.

[편집] 오타와 오류들

Page 번호 원문 수정사항 비고
51 Head의 구조 Heap의 구조
55 Large of Area(LOA) Large Object Area(LOA)
147 Parallel Compaction Collector Parallel Compacting Collection

[편집] 후기 & 잡담

  • Oracle As Datasource 부분은 계륵이었다. 원래 JVM Internal 이라는 제목으로 책을 낼 생각이었기 때문에 Thread Synchronization을 끝으로 마무리 지으려 했었다. 그런데 JDBC가 평소 성능의 사각지대로 생각하고 있었기 때문에 반드시 다루어야 할 주제라고 생각했고 한권의 책으로 내기에는 분량이 너무 적어 JVM Internal과 합본하여 Java Performance Fundamental 이라는 제목으로 탄생하게 된 것이다.
  • 책을 다 쓰고 난 후, KB, MB, GB로 된 저장단위를 다 KByte, MBytes, GByte로 바꿨다. 교정을 보는데 유독 한 단위가 눈에 거슬렸기 때문이다. 어떤 것인지는 여러분의 상상에 맡기겠다.
  • 이 책은 엑셈의 공개세미나인 What's up, your WAS? 의 내용을 풀어서 쓴 것이다. 이것은 Season 1이었고 이것은 책과 같은 제목의 유료 세미나로 전환하여 다시 시작할 것이다. Season 2는 개별 성능 문제를 다루는 [성능의 재구성] 이라는 주제로 공개세미나를 재개해 볼까 한다.