반응형

java 13

[Java] Java 8 vs Java 21 - JVM & GC 변화와 메모리 관리 방식 정리

최근 Java 8에서 Java 21로 업그레이드하면서 JVM 내부 구조나 GC 동작 방식에 많은 변화가 있었다.버전 업그레이드를 진행하면서 단순히 버전 숫자만 올라간 것이 아니라, 메모리 관리 방식, GC 동작 원리, 그리고 이에 따른 서비스 성능에도 다양한 영향을 미치게 되었다.이번 글에서는 Java 8과 Java 21을 기준으로 GC와 JVM 메모리 구조의 변화, 그리고 이러한 변화가 실무에 어떤 영향을 주는지 정리해본다.Java 8 vs Java 21 핵심 변화 정리항목 Java 8 Java 21 변화 포인트기본 GCParallel GCG1 GC안정성 중심으로 변경추가 GC없음ZGC, Shenandoah초저지연 GC 등장PermGen 영역존재삭제, Metaspace로 통합OutOfMemory 리스크..

java 2025.04.12

Java 예외 처리 방식: Exception 클래스를 개별 생성 vs Enum으로 관리

Spring과 Java 기반의 애플리케이션을 개발할 때, 예외 처리 방식은 시스템의 안정성과 유지보수성에 큰 영향을 미칩니다. 이번 글에서는 예외를 클래스별로 생성하는 방식과 Enum을 사용해 관리하는 방식의 장단점을 비교하여, 상황에 맞는 선택을 할 수 있도록 도와드리겠습니다.1. Exception을 클래스별로 생성하는 방식구현 방식예외를 처리하기 위해 특정 상황에 맞는 예외 클래스를 각각 정의하는 방식입니다. 예를 들어, 다음과 같은 예외 클래스를 작성할 수 있습니다:public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message..

java 2024.12.20

인터페이스 VS 추상 클래스

개발자라면 한 번쯤은 ‘인터페이스’와 ‘추상 클래스’에 대해 헷갈렸던 경험이 있을 것입니다. 둘 다 ‘추상화’라는 공통된 목표를 가지지만, 실제 사용 방식과 설계 철학에서는 큰 차이를 보입니다. 이번 글에서는 인터페이스와 추상 클래스의 차이점을 이해하기 쉽게 설명하고, 언제 어떤 것을 사용해야 할지에 대해 알아보겠습니다.추상 클래스란?추상 클래스는 ‘미완성 클래스’라고 할 수 있습니다. 이는 하나 이상의 추상 메서드(구현되지 않은 메서드)를 포함하며, 해당 클래스를 상속받는 하위 클래스에서 이 메서드를 반드시 구현해야 합니다. 하지만 단순히 추상 메서드만 포함할 수 있는 것이 아니라, 일반 메서드(구현된 메서드)와 상태(멤버 변수)도 가질 수 있다는 점에서 강력한 유연성을 제공합니다.특징하위 클래스와의 ..

java 2024.12.18

Java11

String 클래스에 새로운 메소드 추가 다음 6가지 메소드가 추가 되었다. strip(): 문자열 앞, 뒤의 공백 제거. stripLeading(): 문자열 앞의 공백 제거. stripTrailing(): 문자열 뒤의 공백 제거. isBlank(): 문자열이 비어있거나, 공백만 포함되어 있을 경우 true를 반환한다. String.trim().isEmpty() 와 결과가 동일함. repeat(n): n개만큼 문자열을 반복하여 붙여서 반환함. java.nio.file.Files 클래스에 새로운 메소드 추가 다음 3가지 메소드가 추가 되었다. Path writeString(Path, String, Charset, OpenOption): 파일에 문자열을 작성하고 Path로 반환한다. 파일 오픈 옵션에 따라 ..

java 2023.12.07

Java8

Java 8의 특징 Heap Permanent Generation 제거 Java 8 이전에는 초기 설정할 때, PermSize와 MaxPermSize를 설정해 주어야 했으나, Java 8부터는 Permanent Generation이 Metaspace로 대체되었다. Metaspace는 런타임 시 메모리 요구 사항에 따라 자체 크기를 조정하며, 필요하다면 MaxMetaspaceSize 매개 변수를 설정하여 Metaspace의 양을 조절할 수 있다. Permanent Generation Permanet Generation은 Class 혹은 Method Code가 저장되는 영역이다. PermGen은 Heap 영역에 속한다. Default로 제한된 크기를 갖고 있다. Metaspace Metaspace는 Java..

java 2023.12.07

Java8 VS Java11

현재 java8과 java11을 사용하고 있습니다. 하지만 java8과 java11의 차이점도 모르고 사용중이었기에, 정리를 해보았습니다. Java 8의 특징 람다 표현식 (Lambda Expressions) Java 8에서는 함수형 프로그래밍을 지원하기 위해 람다 표현식이 도입되었습니다. 이를 통해 익명 함수를 간결하게 표현할 수 있게 되었습니다. 스트림 API 스트림 API는 데이터 컬렉션을 처리하기 위한 기능을 제공하며, 병렬 처리를 통해 성능을 향상시킬 수 있습니다. 메서드 참조 (Method References) 메서드 참조를 사용하여 기존 메서드를 다른 메서드로 참조하고 호출할 수 있습니다. 기본 메서드 (Default Methods) 인터페이스에 기본 메서드를 추가할 수 있게 되어, 인터페이..

java 2023.12.07

자바 메모리 구조

java 메모리 구조의 관해서 공부하던 중 상시로 읽어보기 위해서 기재하였습니다. JVM 의 전체적인 구조 클래스 로더(Class Loader): 자바 프로그램은 클래스로 구성되어 있으며, 클래스 로더는 이러한 클래스 파일들을 JVM으로 로드합니다. 클래스 로더는 클래스 파일을 찾고 로드하며, 필요한 경우 클래스를 동적으로 로드하여 실행 환경을 구성합니다. 메모리 영역(Memory Areas): JVM은 다양한 메모리 영역을 관리합니다. 메서드 영역(Method Area): 클래스 정보, 정적 변수, 상수 등이 저장되는 영역입니다. 힙(Heap): 인스턴스 객체와 배열이 할당되는 영역으로 동적으로 생성되며, 가비지 컬렉션에 의해 관리됩니다. 스택(Stack): 메서드 호출과 관련된 지역 변수와 메서드 호..

java 2023.08.16

함수형 인터페이스

1. 함수형 인터페이스란? 함수형 인터페이스는 하나의 추상 메서드만을 가지고 있는 인터페이스입니다. 즉, 함수형 인터페이스를 구현하는 클래스는 하나의 메서드만을 반드시 구현해야 합니다. 예를 들어, 아래와 같은 함수형 인터페이스를 정의할 수 있습니다. @FunctionalInterface public interface Calculator { int calculate(int x, int y); } 위 인터페이스는 calculate라는 하나의 메서드만을 가지고 있습니다. 이 인터페이스를 구현하는 클래스는 calculate 메서드를 반드시 구현해야 합니다. 2. 함수형 인터페이스의 활용 Java 함수형 인터페이스는 함수형 프로그래밍을 지원하기 위해 도입되었습니다. 함수형 프로그래밍은 상태를 변경하는 대신 입력..

java 2023.04.06

Java Stream

Java Stream은 컬렉션, 배열 등의 데이터를 다룰 때 사용되는 API로서, 람다식과 함수형 인터페이스를 이용하여 데이터 처리를 더욱 간결하고 효율적으로 할 수 있도록 지원합니다. Stream 개요 Stream은 크게 중간 연산과 최종 연산으로 구성됩니다. 중간 연산은 Stream을 반환하며, 최종 연산은 다른 타입의 값을 반환합니다. 이때, 최종 연산이 수행되기 전까지는 중간 연산이 실행되지 않습니다. Stream API에서 제공하는 대표적인 중간 연산과 최종 연산은 다음과 같습니다. 중간 연산 filter(Predicate predicate): 조건에 맞는 요소만을 Stream에 남깁니다. map(Function mapper): 각 요소를 매핑하여 Stream을 반환합니다. flatMap(Fun..

java 2023.03.28

블로킹(Blocking)? 논블로킹(Non-Blocking)?

블로킹(Blocking) 블로킹이란, 어떤 작업이 수행될 때 해당 작업이 완료될 때까지 프로그램이 다른 일을 할 수 없는 상태를 말합니다. 즉, 입출력 작업을 수행할 때 결과가 반환될 때까지 대기하는 것입니다. 이러한 블로킹 모델은 I/O 작업이 끝날 때까지 스레드를 중단시켜 대기하도록 만들어져 있으며, 이는 시스템 자원의 비효율성을 야기할 수 있습니다. 아래는 블로킹 모델로 I/O 작업을 수행하는 Java 코드입니다. import java.io.*; public class BlockingIOExample { public static void main(String[] args) { try { FileInputStream fileInputStream = new FileInputStream("input.tx..

java 2023.03.07
반응형