분류 전체보기

· 📗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..
· ☘️Spring
이전 글까지는 SpringBoot 가 부팅될 때 일어나는 톰캣 설정과 초기화를 알아보았습니다. 해당 글에서는 톰캣이 논블락킹으로 요청을 받아내고 처리하는 과정과 함께, 왜 톰캣이 NIO 여도 Spring MVC 는 블락킹 서버인지 알아보도록 하겠습니다.Tomcat의 논블로킹(NIO) 소켓 처리Tomcat은 Java NIO(Non-blocking I/O)를 사용하여 소켓을 처리함으로써 높은 성능과 효율적인 자원 관리를 실현합니다. 이번 글에서는 Tomcat이 어떻게 논블로킹 방식으로 요청을 처리하는지에 대해 코드 레벨에서 자세히 알아보겠습니다.Tomcat 의 전체적인 구조를 한번 보도록 하겠습니다. 먼저, Coyote Connector 는 요청을 받아 프로토콜 스펙 (EndPoint) 에 맞게 프로세싱 해..
· ☘️Spring
프로젝트 코드 리뷰 시간에, 한 캠퍼 분께서 Tomcat의 내부 구조를 설명해 주셨습니다. 특히, Acceptor Thread가 모든 요청을 받아 Worker Thread에 전달하고, Worker Thread에서 실제로 요청을 처리한다고 말씀하셨습니다. 당시에는 잘 몰랐지만 주말 동안 공부해보니 이는 바로 `Tomcat NIO Connector`에 대한 이야기였습니다. 이 이야기를 듣자마자 Tomcat 서버와 Spring WebFlux가 비슷하다는 느낌이 들었습니다. 그렇다면 Tomcat을 이용한 Spring Web MVC도 논블로킹이어야 할 것 같은데, 왜 우리는 여전히 one thread per request 동기 블로킹 서버로 알고 있을까요?  먼저 Tomcat 자체를 공부해보며 Servlet과 어..
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가 ..
kkyu0718
'분류 전체보기' 카테고리의 글 목록