자바 객체 표현: OOP와 Klass자바에는 기본 타입(Primitive Type)과 객체 참조 타입(Reference Type) 두 가지 종류의 값만 존재합니다. 특히 객체 참조 타입은 내부적으로 Ordinary Object Pointer(OOP)라는 구조체를 통해 관리됩니다.1. OOP와 객체 헤더자바에서 new로 객체를 생성하면 JVM 힙에 객체가 할당됩니다. 이 객체는 크게 객체 헤더와 인스턴스 데이터로 나뉩니다.객체 헤더: 모든 객체에 공통으로 존재하는 메타데이터 영역입니다. 주로 두 개의 '머신 워드'로 구성됩니다.Mark Word: 객체의 런타임 상태를 추적합니다. 해시 코드, 가비지 컬렉션(GC) 정보, 동기화 락 정보 등이 여기에 저장됩니다.Klass Pointer: 이 객체가 어떤 클래..
JVM 핵심 정리: 자바 성능 최적화의 첫걸음자바 애플리케이션의 성능은 JVM(Java Virtual Machine) 에 대한 깊은 이해로부터 시작됩니다. 이번 글에서는 JVM의 기본 구조부터 클래스 로딩, 컴파일러, 그리고 최적화 기법까지 핵심 내용을 정리해봅니다.1. JVM 기본 구조: 스택 기반 머신과 클래스 로더JVM은 스택 기반 머신으로, 모든 연산은 스택의 최상단 값을 기준으로 이루어집니다. JVM의 가장 중요한 역할 중 하나는 클래스를 메모리로 불러오는 클래스 로더입니다. 자바 9 이후 JDK는 다음과 같은 계층 구조의 클래스 로더를 제공합니다.부트스트랩 클래스 로더 (Bootstrap Class Loader): JVM 내부에 내장된 네이티브 로더입니다. java.base와 같은 핵심 모듈의..
자바 최적화 들어가며자바 최적화에 대한 글을 검색하다 보면, 과거 JVM 환경을 기준으로 한 이야기들이 아직도 상위에 랭크되어 있는 경우가 많습니다.예를 들어, "메서드 디스패치 성능을 위해 작은 메서드를 만들지 말고, 큰 메서드 하나로 작성하라" 라는 조언이 있습니다.하지만 현재의 JVM에서는 이런 최적화는 큰 의미가 없습니다. 이유는 JIT(Just-In-Time) 컴파일러의 발전 덕분에 메서드 디스패치 오버헤드가 더 이상 병목이 아니기 때문입니다. 메서드 디스패치란?메서드 디스패치(Method Dispatch)는 "메서드를 호출할 때 어떤 구현을 실행할지 결정하는 과정"을 의미합니다.- 오버로딩(Overloading) → 컴파일 시점에 호출 메서드가 결정 (정적 디스패치)- 오버라이딩(Overrid..
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 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 ..
정렬 알고리즘 구현을 공부하던 중, 자바의 정렬 알고리즘이 어떻게 구현되어 있는지 궁금해져서 조사해 보았습니다. 그 결과는 다음과 같습니다.원시타입: DualPivotQuickSort를 사용합니다. 이는 Quick Sort의 변형으로, 배열의 크기에 따라 다른 정렬 알고리즘과 섞어 사용됩니다. 자세한 내용은 여기 참조: Java Arrays.sort() 분석객체타입: 이전에는 MergeSort를 사용했으나 현재는 TimSort를 사용합니다. TimSort는 InsertionSort와 MergeSort의 조합입니다. Collections.sort 또한 내부적으로 Object[]로 변환하여 Arrays.sort()를 사용합니다. TimSort 는 왜 Insertion Sort 를 썼을까?TimSort가 ..
Optional 를 쓰는 이유메소드의 시그니처만 보고도 선택형 값을 기대해야하는지 판단 가능null 에 의한 null pointer exception 발생에 대한 해결책으로 등장Optional.empty()와 null의 차이Optional.empty() : Optional의 싱글턴 인스턴스를 반환하는 정적 팩토리 메서드를 통해 생성됨. 객체 그 자체null : 참조하면 Null Pointer Exception 이 발생Optional.of() 와 Optional.ofNullable() 차이Optional.of(some) : some 이 null이라면 npe가 발생한다.Optional.ofNullable(some) : some이 null이라면 Optional 객체를 만든다.도메인 모델에 Optional를 사..
참고 https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-Reflection-API-%EC%82%AC%EC%9A%A9%EB%B2%95#reflection_api_%EA%B8%B0%EB%B2%95 https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-Dynamic-Proxy-%EB%8B%A4%EB%A3%A8%EA%B8%B0 https://tlatmsrud.tistory.com/112 ..
람다란 무엇인가?메서드로 전달할 수 있는 익명 함수를 단순화한 것익명 : 보통의 메서드와 달리 이름이 없음함수 : 메서드처럼 특정 클래스에 종속되지 않음전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있음간결성 : 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없음 함수형 인터페이스란?오직 하나의 추상 메서드를 지정하는 인터페이스람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달@FunctionalInterface 어노테이션으로 정의 가능 ❗Comparator 는 FunctionalInterface 가 맞나요?코드를 살펴보니까 추상 메소드가 하나가 아니라 두 개다!package java.util;@FunctionalInterfacepublic interface Co..
함수형 프로그래밍이 주는 이점을 이해해보자 동작 파라미터화란?public void printString(String input) { System.out.println("hello " + input);} 본래 인수는 항상 객체를 받는다. 위의 예시에서는 String input 객체가 해당된다. 우리는 함수형 프로그래밍을 위해 동작 (함수) 를 전달하는 방법을 몰색한다. 그 방법은 간단하게 보면 다음과 같다. Thread 인스턴스 생성을 예시로 보자. Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("run!"); }});우리는 run() 이라는 동작 (함수) 를 전달하고 싶다. 그러나 인..