분류 전체보기

· 📗Java
자바 객체 표현: OOP와 Klass자바에는 기본 타입(Primitive Type)과 객체 참조 타입(Reference Type) 두 가지 종류의 값만 존재합니다. 특히 객체 참조 타입은 내부적으로 Ordinary Object Pointer(OOP)라는 구조체를 통해 관리됩니다.1. OOP와 객체 헤더자바에서 new로 객체를 생성하면 JVM 힙에 객체가 할당됩니다. 이 객체는 크게 객체 헤더와 인스턴스 데이터로 나뉩니다.객체 헤더: 모든 객체에 공통으로 존재하는 메타데이터 영역입니다. 주로 두 개의 '머신 워드'로 구성됩니다.Mark Word: 객체의 런타임 상태를 추적합니다. 해시 코드, 가비지 컬렉션(GC) 정보, 동기화 락 정보 등이 여기에 저장됩니다.Klass Pointer: 이 객체가 어떤 클래..
· 📗Java
JVM 핵심 정리: 자바 성능 최적화의 첫걸음자바 애플리케이션의 성능은 JVM(Java Virtual Machine) 에 대한 깊은 이해로부터 시작됩니다. 이번 글에서는 JVM의 기본 구조부터 클래스 로딩, 컴파일러, 그리고 최적화 기법까지 핵심 내용을 정리해봅니다.1. JVM 기본 구조: 스택 기반 머신과 클래스 로더JVM은 스택 기반 머신으로, 모든 연산은 스택의 최상단 값을 기준으로 이루어집니다. JVM의 가장 중요한 역할 중 하나는 클래스를 메모리로 불러오는 클래스 로더입니다. 자바 9 이후 JDK는 다음과 같은 계층 구조의 클래스 로더를 제공합니다.부트스트랩 클래스 로더 (Bootstrap Class Loader): JVM 내부에 내장된 네이티브 로더입니다. java.base와 같은 핵심 모듈의..
· 📗Java
자바 최적화 들어가며자바 최적화에 대한 글을 검색하다 보면, 과거 JVM 환경을 기준으로 한 이야기들이 아직도 상위에 랭크되어 있는 경우가 많습니다.예를 들어, "메서드 디스패치 성능을 위해 작은 메서드를 만들지 말고, 큰 메서드 하나로 작성하라" 라는 조언이 있습니다.하지만 현재의 JVM에서는 이런 최적화는 큰 의미가 없습니다. 이유는 JIT(Just-In-Time) 컴파일러의 발전 덕분에 메서드 디스패치 오버헤드가 더 이상 병목이 아니기 때문입니다. 메서드 디스패치란?메서드 디스패치(Method Dispatch)는 "메서드를 호출할 때 어떤 구현을 실행할지 결정하는 과정"을 의미합니다.- 오버로딩(Overloading) → 컴파일 시점에 호출 메서드가 결정 (정적 디스패치)- 오버라이딩(Overrid..
· 📗Java
static class 와 static method 차이`static class` 는 inner class 에서 사용되는 개념으로 Outer class 를 인스턴스화 없이 사용하는 클래스를 (inner) static class 라고 합니다. 그리고 `static method` 또한 속한 클래스의 인스턴스화 없이 사용되는 메소드를 의미합니다.예시를 보면 이해가 더 쉽습니다.class Outer { class NonStaticInner { } static class StaticInner { } public static void print() { }}Outer.NonStaticInner = new Outer.NonStaticInner(); // 컴파일 에러Outer.StaticInner in..
InnoDB 엔진 기준으로 작성된 글 입니다. 클러스터링 인덱스 MySQL 은 물리적으로 데이터를 저장함에 있어 두 가지 특징이 있다.비슷한 PK 를 가진 데이터는 같은 페이지에 저장된다. 즉, PK 가 데이터 저장 위치를 결정한다. 예를 들면, 그림에서 emp_no 가 PK 일 때, PK 4번 5번은 페이지 번호 9에 같이 저장되어 있고, PK 11 12번은 페이지 번호 10에 저장되어 있다.페이지 안의 데이터는 정렬되어 저장되어 있다. 예를 들면, 그림에서 페이지 번호 안의 데이터는 PK 를 기준으로 오름차순 정렬되어 있다.이 때, PK 가 비슷한 데이터끼리 물리적으로 저장된다는 이유 때문에 PK 를 `클러스터링 인덱스` 라고 부른다.  인덱스에 대한 오해?여기서 짚고 넘어가야할 점이 있다. 흔히 C..
MySQL 서버MySQL 서버는 크게 `MySQL 엔진` 과 `스토리지 엔진` 으로 나뉜다. MySQL 엔진이 사람의 머리 역할을 하고 스트로지 엔진은 손발 역할을 하는데 구성 요소는 다음과 같다. MySQL 엔진클라이언트 접속 및 쿼리 요청을 처리하는 `커넥션 핸들러`, `SQL 파서 및 전처리기`, `옵티마이저` 가 해당된다.스토리지 엔진실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분이다. MySQL 엔진은 하나지만 스트리지 엔진은 여러 개 동시 사용 가능하다. MySQL 엔진은 `핸들러 API` 를 통해 스토리지 엔진에 읽기 쓰기 요청을 하는데, 그렇게 되면 스토리지 엔진의 `핸들러` 가 실제 액션을 실행한다.MySQL 스레딩 구조MySQL 서버는 프로세스 기..
· 📗Java
Spring Framework 6.1 부터 JDK 21 (Virtual Thread) 와의 호환을 지원하기 시작한다고 합니다. 비슷하게 block 된 쓰레드에 대한 관리를 해주는 Webflux 가 Virtual Thread 덕분에 이젠 필요가 없어지는 걸까요? 먼저 Virtual Thread (가상 쓰레드) 가 기존의 쓰레드와 어떠한 점이 달라졌는지 먼저 살펴보고, 성능 차이를 확인해보도록 하겠습닌다.기존 자바 쓰레드 동작 원리Spring Web MVC 기준Thread t = Thread.ofPlatform() JVM 의 플랫폼 쓰레드를 생성합니다.플랫폼 쓰레드가 동작하려면 CPU 에 접근해야 합니다. 그러기 위해서는 커널 쓰레드와 매핑이 1:1 로 되어야하는데 이에 대한 중간 매개체가 JNI(Java ..
· 📗Java
정렬 알고리즘 구현을 공부하던 중, 자바의 정렬 알고리즘이 어떻게 구현되어 있는지 궁금해져서 조사해 보았습니다. 그 결과는 다음과 같습니다.원시타입: DualPivotQuickSort를 사용합니다. 이는 Quick Sort의 변형으로, 배열의 크기에 따라 다른 정렬 알고리즘과 섞어 사용됩니다. 자세한 내용은 여기 참조: Java Arrays.sort() 분석객체타입: 이전에는 MergeSort를 사용했으나 현재는 TimSort를 사용합니다. TimSort는 InsertionSort와 MergeSort의 조합입니다. Collections.sort 또한 내부적으로 Object[]로 변환하여 Arrays.sort()를 사용합니다.  TimSort 는 왜 Insertion Sort 를 썼을까?TimSort가 ..
· 🔍Kotlin
제네릭 타입 파라미터 코틀린에서는 자바와는 달리, 제네릭 타입의 타입 인자를 프로그래머가 명시하거나 컴파일러가 추론할 수 있어야 합니다. // 1. 컴파일러 타입 추론 val authors = listof("A", "B") // 2. 변수 선언쪽에 타입 선언 val readers: MutableList = mutableListOf() // 3. 변수를 만드는 함수의 타입인자 지정 val readers = mutableListOf() 1. 제네릭 함수 fun List.slice(indices: IntRange): List 제네릭 함수의 타입 파라미터 T를 선언합니다. 2. 제네릭 확장 프로퍼티 val List.penultimate: T 3. 제네릭 클래스 선언 interface List { operator..
· 🔍Kotlin
Field 필드 / Property 프로퍼티 자바에서는 필드와 접근자 메서드를 묶어 프로퍼티라고 지칭한다. 코틀린에서는 필드에 대한 기본 접근자 메서드를 자동으로 만들어주기 때문에 필드 대신 프로퍼티라는 말을 사용한다. Backing Field 프로퍼티의 값을 메모리에 저장하기 위한 필드 대부분의 프로퍼티에는 backing field 가 존재하지만 원한다면 프로퍼티 값을 메모리에 저장하지 않고 바로바로 계산하도록도 할 수 있다 프로퍼티를 선언해줄 때 다음 조건을 만족시킨다면 (메모리에 저장할 필요가 있어지기 때문에) 자동으로 backing field 가 생김 적어도 하나의 접근자가 기본으로 구현되는 접근자를 사용하는 경우 커스텀 접근자가 field 키워드를 통해 backing field 를 참조하는 경우..
kkyu0718
'분류 전체보기' 카테고리의 글 목록