본문 바로가기

전체 글

(21)
JVM 내부 구조 (2) - 런타임 데이터 영역 JVM 메모리 영역 - Runtime Data Area 자바 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 그 메모리를 여러 영역으로 나누어 관리함 JVM 메모리 영역 "Runtime Data Area"는 크게 세 가지 영역으로 구분할 수 있음 - 메소드 영역, 힙 영역, 스택 영역 메소드 영역과 힙 영역은 모든 스레드가 공유하는 영역 스택 영역과 기타 영역들은 스레드별로 생성되는 영역 메소드 영역 (static 영역) 클래스 로더에 의해 클래스가 로딩될 때 생성 클래스 로더가 읽어 들인 클래스에 대한 런타임 상수 풀, 필드 데이터, 메소드 데이터 등을 저장 모든 스레드가 공유하는 영역이기 때문에 공유 데이터의 경우 thread safe 해야 함 클래스 파일 구조 컴파일된 클래스 파일은 아래..
JVM 내부 구조 (1) - 클래스 로더 클래스 로더 자바 소스파일을 컴파일하면 바이트 코드로 이루어진 클래스 파일로 변환 자바 프로그램이 실행되면 클래스 로더는 클래스 파일을 JVM 내부 메모리에 로드함 메모리에 처음 로딩되는 클래스는 일반적으로 main() 메소드가 포함된 클래스 클래스 로더는 크게 세 단계로 처리됨 : 로딩(Loading), 링킹(Linking), 초기화(Initialization) 로딩 클래스 파일의 데이터를 생성하고, JVM 내부 메모리 영역에 로드 JVM은 ClassLoader.loadClass() 메소드를 통해서 클래스 파일을 메모리에 로드 클래스 파일은 기본 제공 클래스인지, 개발자 정의 클래스인지와 같은 기준에 의해 세 가지 수준으로 나뉨 부트스트랩 클래스 로더 (Bootstrap Class Loader) 루트 ..
Java 프로그램의 실행 과정 Java 프로그램의 실행 과정 소스 코드 작성 컴파일러(javac)는 자바 소스코드(.java)를 JVM이 해석할 수 있는 바이트 코드(.class)로 변환 JVM은 클래스 파일의 바이트 코드를 해석하여 바이너리 코드로 번역하고 연산을 처리 MyProgram.java public class MyProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } MyProgram.class # 아래 컴파일 명령을 통해 MyProgram.class 파일이 생성된다. javac MyProgram.java # 32bit 기반의 헥사코드로 나타낸 바이트 코드 00 01 02 03 04 05 06 07 08 09 0A 0..
JVM, JDK, JRK JVM (Java Virtual Machine) 자바 프로그램을 실행하는 프로그램 자바 바이트 코드를 어떻게 실행할 지에 대한 표준을 특정 벤더가 구현한 구현체 클래스 파일에 작성된 자바 바이트 코드를 인터프리터 또는 JIT 컴파일러를 통해 OS에 특화된 코드로 변환하여 실행 자바 프로그램을 모든 플랫폼에서 제약 없이 동작 시킬 수 있음 JVM은 특정 플랫폼에 종속적임 모든 플랫폼에서 제약없이 동작한다고 했는데 플랫폼에 종속적이라는 말은 무엇일까? 자바 프로그램 자체는 플랫폼에 종속되지 않지만, JVM은 플랫폼에 맞게 설치해줘야 한다. 처음엔 조삼모사가 아닐까라고 생각했지만 다양한 환경에 코드를 배포해야 하는 상황에 개발자가 자신이 작성한 코드를 모든 환경에 맞춰 컴파일 해야한다면 상당히 번거로울 것이다..
MySQL 퍼포먼스 최적화를 읽고(6) - 스토리지 엔진 레벨에서의 접근법 InnoDB만 고집하지 말고 때로는 스토리지 엔진을 바꿔보자 InnoDB는 MyISAM과 달리 인덱스뿐만 아니라 데이터까지 버퍼 풀에 저장한다. 이 때문에 데이터가 메모리에 있으면 디스크를 읽지 않아도 된다는 큰 장점이 있다. 하지만 인덱스와 데이터 모두 메모리에 적재한다는 점에서 메모리 사용 효율이 좋지는 않다. 게다가 PK를 제외한 보조 인덱스는 인덱스 칼럼 + PK의 구조를 가지기 때문에 인덱스 자체의 사이즈가 상당히 커질 수 있다. 이러한 특성 때문에 테이블 용도가 로그 수집과 같이 단순하다면 오히려 메모리 사용 효율이 크게 떨어질 수밖에 없다. 위 그림과 같이 단순 로그 수집을 위한 테이블 데이터가 InnoDB 버퍼 풀을 가득 채운다면 서비스와 연관된 데이터에 할당할 메모리 공간까지 차지하지 때..
MySQL 퍼포먼스 최적화를 읽고(5) - 스키마 레벨에서의 접근법 인덱스는 적재적소에 배치하자 InnoDB에서 PK는 성능에 직접적인 영향을 준다 InnoDB에서는 PK순으로 데이터가 저장된다. PK는 데이터에 접근하는 물리적인 주소로 사용된다고 봐도 된다. MSSQL의 클러스터 인덱스, 오라클의 Index Organized Table 개념이 MySQL에서는 PK로 구현된 것이다. 즉, 인덱스 순서로 데이터가 정렬되어 디스크에 저장된다. (칼럼1, 칼럼2) 복합키를 PK로 하는 테이블이 있다면 위와 같은 형태로 데이터가 저장된다. 여기서 PK가 (21, 31)인 데이터가 입력된다면? 1건의 데이터를 저장하기 위해 4건의 데이터가 물리적으로 이동하게 된다. 위처럼 인덱스 칼럼의 변경이 자주 일어나면 DB 성능이 상당히 저하된다. 만약 테이블의 PK가 설정되어 있지 않은 ..
MySQL 퍼포먼스 최적화를 읽고(4) - SQL 레벨에서의 접근법 데이터 흐름을 이해하자 조인 성능 테스트 조인은 여러 테이블에서 하나의 결과를 가져올 수 있다는 점에서 편리하지만, 데이터가 누적됨에 따라 쿼리 성능이 점진적으로 저하된다. SELECT a.* , d.text_field AS text_field1 , e.text_field AS text_field2 FROM tab01 a INNER JOIN tab02 b ON b.tab01_seq = a.seq INNER JOIN tab03 c ON c.tab02_seq = b.seq LEFT JOIN tab04 d ON d.tab03_seq = c.seq LEFT JOIN tab05 e ON e.tab03_seq = c.seq WHERE a.status IN ('01', '02') AND b.status NOT IN ..
MySQL 퍼포먼스 최적화를 읽고(3) - WHERE 조건 이해 묵시적 형변환의 함정 묵시적 형변환이란? 조건절의 데이터 타입이 다를 때 우선순위가 높은 타입으로 타입이 내부적으로 변환되는 것을 말하며, 정수 타입이 문자열 타입보다 우선순위가 높다. 문자열과 정수값을 비교하는 쿼리가 있다면 우선순위가 낮은 문자열은 자연스럽게 정수 타입으로 형변환되어 처리된다. 형변환은 언제든지 발생할 수 있다. 하지만 묵시적 형변환이 발생하는 대상이 인덱스 필드라면 조건절을 처리하기 위해 해당 필드(칼럼)의 모든 데이터를 묵시적으로 형변환하기 때문에 인덱스를 사용하지 못하고, 테이블 풀 스캔을 할 수밖에 없다. 테스트 테이블 생성 및 데이터 입력 CREATE TABLE test ( row_id int unsigned NOT NULL auto_increment, integer_fiel..