본문 바로가기

Java20

[JVM] 저지연 가비지 컬렉터 : 세넌도어 이번 글은 "JVM 밑바닥까지 파헤치기" 책의 3.6 "저지연 가비지 컬렉터"의 객체 돌아보기에 대한 부분을 정리 및 요약한 글입니다. 완벽한 가비지 컬랙터 존재 가능성자바 개발자라면 한 번쯤은 GC로 인한 이슈를 겪게 됩니다. 응답 시간이 튀거나, 시스템이 멈춘 듯한 순간들은 대부분이 GC로부터 비롯됩니다. 이로 인해, 사람들이 성능 좋은 GC를 찾아 다양한 실험을 하게 됩니다. 그런데 여기서 한 가지 의문점이 생깁니다."왜 완벽한 가비지 컬렉터는 아직도 없는 걸까요?" GC의 꾸준한 진화GC는 오랜 시간 동안 진화를 거듭해왔습니다. 초기에 Serial GC에서 시작해 CMS(Concurrent Mark Sweep)로, 최근에는 G1GC(Garbage First)로 기본 GC가 변경되었습니다. 요즘은 .. 2025. 4. 21.
[JVM] 핫스팟 VM에서의 객체 돌아보기 이번 글은 "JVM 밑바닥까지 파헤치기" 책의 2.3 핫스팟 가상 머신에서의 객체 돌아보기에 대한 부분을 정리 및 요약한 글입니다. 객체 생성자바는 객체 지향 프로그래밍 언어로 자바 프로그램이 동작하는 동안 언제든 수시로 객체가 만들어집니다. 언어 수준 객체 생성자바는 객체 지향 언어 프로그래밍으로 동작하는 동안 언제나 수시로 객체가 만들어집니다.언어 수준에서는 객체 생성은 간단하게 new 키워드를 사용하면 끝납니다.가상 머신 수준에서는 어떤 과정을 거쳐 객체가 생성될까요?가상 머신 수준 객체 생성가상 머신에서는 new 명령어의 바이트코드를 만나게 되면, 해당 명령의 매개 변수가 상수 풀 안의 클래스를 가리키는 심벌 참조인지 먼저 확인합니다. 그다음으로 이 참조가 뜻하는 클래스가 로딩, 해석, 초기화 되.. 2025. 4. 16.
[JVM] OutOfMemory 예외 이번 글은 "JVM 밑바닥까지 파헤치기" 책의 2.4 실전 : OutOfMemoryError 예외에 대한 부분을 정리 및 요약한 글입니다. 이번 절의 목적은 각 런타임 영역에 저장되는 내용을 검증하고, 실제 메모리 오버플로가 일어나는 과정을 경험하는데 초점이 맞춰집니다.다음 나오는 예제 코드들의 첫 부분에는 예제 실행 시 설정해야 하는 가상 머신 시작 매개 변수가 주석으로 적혀 있습니다.('VM 매개 변수'로 시작하는 주석) 이 매개 변수들은 실행 결과에 영향을 줍니다. 실행 및 디버그 구성-Xms20mJVM이 실행될 때 초기로 확보할 힙 메모리 크기를 설정합니다.-Xmx20mJVM이 사용할 수 있는 힙 메모리의 최대 크기를 지정합니다.-XX:+HeapDumpOnOutOfMemoryErrorOutOfMe.. 2025. 4. 15.
리플렉션(Reflection) 프록시로 부가 기능을 추가하고 싶은데,클래스를 생성할 때마다 매번 프록시 객체를 따로 만들어야 할까요?  이번글은 동적 프록시에 사용되는 리플렉션에 대해서 정리했습니다.참고 강의 : 김영한의 스프링 핵심 원리 - 고급편 만약 새로 생기는 클래스 100만개가 있다면, 어떻게 될까요? 만약 새로운 클래스가 100만 개나 생긴다면, 이 100만 개의 클래스마다 일일이 프록시 객체를 생성해주는 것은 매우 비효율적입니다.이러한 문제를 해결하기 위해, 동적 프록시기법을 활용할 수 있습니다. 동적 프록시는 리플렉션(reflection)을 이용해 런타임에 필요한 부가 기능을 프록시 객체에 주입하는 방식으로,별도의 프록시 클래스를 100만 개 준비할 필요 없이, 프록시 생성 로직을 공통화하여 관리할 수 있습니다.이로써,.. 2025. 3. 7.
ArrayList가 크기를 늘리는 방법 ArrayList는 데이터를 추가할때마다 공간을 확장하는 걸까?아니면 미리 확장하는 걸까? 이번글은 ArrayList가 공간을 확장하는 방법에 대해서 알아보겠습니다.예시로 Java 6,7,8 버전별 ArrayList의 공간을 확장하는 방법을 비교해보겠습니다. ArrayList가 공간을 확장할때, 정말 동적으로 할당해줄까요? ⚠️ 글의 앞부분에서는 간단한 디버깅을 통해 동적 할당이 이루어지는지를 확인합니다. 각 메서드에 대한 설명은 아래에서 자세히 다룹니다. 디버깅은 Java v17을 기준으로 합니다. 디버깅을 통해서 직접 알아보겠습니다. ArrayList에 값을 추가하면서, ArrayList가 어떠한 메서드를 호출해서 공간을 확장하는지 알아보기 위해 디버깅을 해본 결과 다음과 같습니다.  grow()라는.. 2025. 2. 8.
[Java] Serialization 기술 면접을 대비해Java의 Serialization와 관련된 질문과 답을꼬리 질문 형태로 작성한 글입니다. Q. 직렬화(serialization)란 무엇이며 왜 자바에서 사용하나요? 답변해주세요. A : Java의 객체를 외부와 상호작용 할때, 데이터 형태를 맞춰주기 위해서 사용합니다. 답변에 대한 평가: 40점평가 이유: 답변은 일부 맞는 내용을 포함하고 있지만, 직렬화의 개념을 충분히 설명하지 않았습니다. 또한, 왜 자바에서 직렬화를 사용하는지에 대한 이유도 명확히 언급되지 않았습니다. Q. Java에서 객체를 직렬화하는 과정에는 어떤 단계들이 포함되어 있나요? 직렬화된 객체를 외부와 상호작용할 때 어떤 장점이 있는지 설명해주세요. A : 직렬화 과정은 먼저, 직렬화가 필요한 클래스에 Seriali.. 2025. 1. 27.
부동 소수점 이 글은 컴퓨터에서 소수를 나타내는 방식인부동 소수점에 대해서 정리한 글입니다. 실수란?실수는 수직선 상에서 나타낼 수 있는 모든 숫자를 말합니다. 실수로는 정수, 유리수, 무리수 등 모든 수를 포함하는 개념입니다. 실수는 언제 사용될까?실수는 연속적인 데이터나 정확한 표현이 필요할 때 사용합니다. 정수만으로는 표현할 수 없는 값, 정밀도가 필요한 계산에 적합합니다.예시로는 수학, 과학, 공학, 컴퓨터 그래픽, 금융과 같은 분야에 사용됩니다. 컴퓨터에서 실수는 어떻게 표현할까?현 시점에서 실수는 이진수 기반의 부동 소수점 방식으로 표현됩니다. 이는 IEEE 754 표준에 따라, 실수를 유효숫자와 지수로 나누어 표현합니다. 부동 소수점 방식은 무엇일까?부동 소수점은 컴퓨터가 실수를 효율적으로 저장하고 계산.. 2025. 1. 11.
immutable 객체로 만드는 방법 이번 글은 불변 객체란 무엇이고 어떻게 만들수 있을지에 대한방법을 이야기하는 글입니다. 불변 객체(immutable Object)란?불변 객체는 객체를 생성 후 그 상태를 바꿀 수 없는 객체를 말합니다.객체의 상태를 바꿀수 없다는 말은 어떤 의미를 가질까요? 이는 객체가 생성된 이후 내부 데이터(필드 값)을 변경할 수 없는 특성을 의미합니다. 대표적인 예로 String 클래스를 들 수 있습니다. 이를 코드로 확인해 보겠습니다.public class Main { public static void main(String[] args) { String immutableObject = "immutable"; immutableObject.replace("immutable", "muta.. 2025. 1. 9.
JVM 정복하기 📍 JVM이란?JVM(Java Virtual Machine)은 Java 플랫폼의 초석입니다. 이는 하드웨어 및 운영 체제의 독립성, 컴파일된 코드의 작은 크기, 악성 프로그램으로부터 사용자를 보호하는 기능을 담당하는 기술의 구성 요소 입니다.JVM은 추상 컴퓨팅 머신입니다. 실제 컴퓨팅 머신처럼 명령어 세트가 있으며 실행 시 다양한 메모리 영역을 조작합니다.JVM은 java 프로그래밍 언어에 대해 아무것도 알지 못하며, 특정 바이너리 형식인 클래스 파일 형식만 알고 있습니다. 클래스 파일에는 java Virtual Machine 명령어(또는 바이트 코드)와 심볼 테이블 및 기타 보조 정보가 포함되어 있습니다. Q. JVM이 어떻게 악성 프로그램으로부터 사용자를 보호하는가?바이트 코드 검증, 클래스 로더.. 2025. 1. 9.