성장을 꾸준히 기록하는 공간

고정 헤더 영역

글 제목

메뉴 레이어

성장을 꾸준히 기록하는 공간

메뉴 리스트

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (108)
    • tech (28)
    • spring (14)
    • mysql (8)
    • kubernetes (12)
    • kafka (12)
    • windows (6)
    • project (26)
      • wargame (12)
      • resistance (5)
      • SIEMple (6)
      • Witch's Tower (3)

검색 레이어

성장을 꾸준히 기록하는 공간

검색 영역

컨텐츠 검색

spring

  • JVM Metaspace가 단순히 이름만 바꾼건 아닐텐데요

    2026.01.14 by downfa11

  • 토스가 겪은 Reactor Netty의 Memory Leak 이슈를 알아보자

    2025.08.18 by downfa11

  • AOP를 이용한 @Transactional의 동작 원리 (feat. 트랜잭션의 범위, 전파)

    2025.07.12 by downfa11

  • JVM 튜닝 목적으로 Heap 덤프 분석은 처음 해봐요 (feat. Eclipse MAT)

    2025.06.13 by downfa11

  • What Color is Your Function? (feat. 함수의 색 전염성)

    2025.03.12 by downfa11

  • Java도 한다 경량 쓰레드 (Virtual Thread)

    2025.02.26 by downfa11

  • JVM의 Garbage Collector 분석 (feat. ZGC와 G1간의 차이점 비교)

    2025.02.26 by downfa11

  • Java17 - String 클래스의 최적화

    2025.02.25 by downfa11

JVM Metaspace가 단순히 이름만 바꾼건 아닐텐데요

Java 8부터 JVM 메모리 구조에서 PermGen 영역이 제거되고 Metaspace가 도입되었다. 이 변화는 그동안 개발자들을 괴롭히던 OutOfMemoryError: PermGen space 오류를 사라지게 만들었고, Heap 영역에서 관리받던 친구를 바깥으로 빼버리면서 JVM 메모리 관리가 한층 단순해진 것처럼 보였다. 하지만 이 변경은 메모리 사용량 자체를 줄이거나, 클래스 로딩 문제를 근본적으로 해결한 결정은 아니었다. PermGen이 담당하던 클래스 metadata를 Heap 내부에서 관리하던 방식이, Native memory로 이동했을 뿐이다. 즉, JVM이 직접 통제하던 메모리 영역을 OS의 메모리 관리에 위임한 것이다. 이 지점부터 Java 8 이후의 메모리 문제는 Heap이 아니라 ..

spring 2026. 1. 14. 17:14

토스가 겪은 Reactor Netty의 Memory Leak 이슈를 알아보자

토스에서 제공하는 기술 블로그를 통해서 어떤 사고 과정을 거쳐서 문제를 해결하는지 권위자들의 시야를 엿볼 수 있어서 훔쳐보고(?) 커비처럼 빨아먹어야 한다. 클러스터 안에는 수많은 서버들이 Spring WebClient를 통해 REST API로 통신해서 요청을 처리한다.1. Spring Cloud Gateway의 Memory Leak 이슈 파악하기해당 컨테이너에 지정한 메모리 상한을 사용한 총 메모리가 초과한 경우 OOMKilled 알림을 보낸다. 그런데 Gateway가 왜 OOM으로 죽어? Gateway의 OOM 문제를 트러블 슈팅하는 과정으로 JVM 튜닝에 대한 이야기부터 시작한다. 토스에서는 메모리 할당에 드는 오버헤드를 줄이기 위해서 -XX:+AlwaysPreTouch JVM 옵션을 사용해서..

spring 2025. 8. 18. 18:19

AOP를 이용한 @Transactional의 동작 원리 (feat. 트랜잭션의 범위, 전파)

Spring이 제공하는 트랜잭션의 기능트랜잭션 동기화: 컨텍스트 내에서 일관된 처리트랜잭션 추상화: jdbc, jpa 등의 다양한 인터페이스를 동일한 방식으로 제공AOP를 이용한 트랜잭션 분리: 트랜잭션이라는 관심사(Aspect)를 분리해서 비즈니스에 집중시킴 AOP(Aspect Oriented Programming)은 흩어진 관심사를 별도의 클래스로 모듈화하는 방식을 말한다.Aspect: 애플리케이션 내에서 중복으로 존재하는 부가 기능(advice)을 모듈화Advice: Aspect에 구현된 실제의 부가 기능 코드Pointcut: Aspect를 어디에 적용할지 지정 (언제)EX) @GetMapping시에만, UserService만 등의 언제 실행할지 정하는 조건문JointPoint: Advice가 실행..

spring 2025. 7. 12. 10:22

JVM 튜닝 목적으로 Heap 덤프 분석은 처음 해봐요 (feat. Eclipse MAT)

OOM 아닌 경우에 직접 힙 덤프 뜨는건 처음인거 같다. 겉핥기식을 넘어서 그래도 덤프 분석을 좀 진득하게 해볼 수 있었다. Heap 메모리는 JVM 내에서 임의로 생성된 객체들이 동적으로 할당되는 공간을 말한다.Heap의 덤프 파일은 운영중인 애플리케이션의 Heap 영역을 snapshot으로 기록한 파일을 일컫는다. GC Logs만 놓고 분석할때는 Eden 영역이 작은지 계속 꽉 차는 일이 잦았다.짧은 수명주기를 가지는 객체가 대부분이어서 GC시 비효율적인 메모리 사용이 생기는 것으로 보인다. ZGC같은 경우는 과도한 CPU 사용이나 TPS 저하문제를 바로잡기 위한 튜닝이 중요하다.Heap 영역을 넉넉하게 잡을수록 GC 주기가 길어진다. 반대로, 작으면 자주 GC를 돌려야해서 TPS가 저하하게 된다. ..

spring 2025. 6. 13. 16:18

What Color is Your Function? (feat. 함수의 색 전염성)

본 블로그 글의 내용은 이전 글인 'Java도 한다 경량 쓰레드 (Virtual Thread)' 중에서 설명하는 함수의 색상 문제를 다룬다. Java도 한다 경량 쓰레드 (Virtual Thread)봄(Spring)은 왔는가?Java의 위대한 산물인 가상 쓰레드는 분명 JVM 생테계에 엄청난 열풍을 일으켰음에 의심할 여지가 없다.많은 개발자들이 그 패러다임에 발맞춰서 프레임워크를 개선하고 있듯downfa11.tistory.com   함수의 색 문제 (Function coloring Problem)아래의 포스트에서부터 시작한 논의로 Java, Kotlin, Go 등의 언어에 대해서 활발하게 이야기되고 있다.  What Color is Your Function? – journal.stuffwithstuff...

spring 2025. 3. 12. 03:49

Java도 한다 경량 쓰레드 (Virtual Thread)

봄(Spring)은 왔는가?Java의 위대한 산물인 가상 쓰레드는 분명 JVM 생테계에 엄청난 열풍을 일으켰음에 의심할 여지가 없다.많은 개발자들이 그 패러다임에 발맞춰서 프레임워크를 개선하고 있듯이, 나도 얼른 쫓아가겠다.  * 구조도를 직접 그린게 이해하기 어려우면 맨 아래의 출처에 가면 다른 이미지도 있습니다  Java의 기존 쓰레드 모델 (JDK 17 이하)컨텍스트 스위칭을 통해 OS 자체의 리소스를 점유하는 방식으로, JVM 내에서 플랫폼 쓰레드를 생성할때 JNI를 사용해서 OS(Kernel) 쓰레드에 직접 매핑되도록 설계되었다.  Heap에 존재하는 수많은 유저 쓰레드 중 하나가 JVM의 스케줄링에 따라서 커널 쓰레드에 매핑되어 실행되는 기존 구조스케줄링은 ExecutorService에 의해서..

spring 2025. 2. 26. 22:53

JVM의 Garbage Collector 분석 (feat. ZGC와 G1간의 차이점 비교)

우리는 JVM 위에서 동작하는 다양한 언어, 프레임워크, 라이브러리나 도구 등을 포함한 광범위한 영역에서 활동한다.이러한 JVM 생태계 전반에 대한 이해를 위해서 먼저 JVM을 깊게 이해하고자 한다.  Java Virtual Machine(JVM)의 이해단순히 Java만 실행하는 것이 아니라 Kotlin, Scala, Groovy 등의 다양한 언어를 바이트코드로 실행하는 가상머신으로, 플랫폼 독립적인 환경을 제공한다.바이트코드 실행GC를 통한 자동 메모리 관리JIT 컴파일로를 활용한 런타임 최적화효율적인 쓰레드 관리  1. Java Code를 컴파일(javac)2. JVM이 이해할 수 있는 바이트코드(.class)를 JVM의 클래스 로더(Class Loader)가 메모리에 적재3. 런타임 메모리 영역(M..

spring 2025. 2. 26. 16:34

Java17 - String 클래스의 최적화

기존 JDK(17 이하)와 달라진 Stirng 클래스의 최적화에 대해 알아보자. 크게 배워야할 부분은 없고 3가지 특징으로 구분할 수 있다. String 관련 성능이 기존보다 훨씬 최적화되었다. (메모리 절약 + 실행 성능 향상 + GC 부담 감소) 1. Compact Strings 유지Java8까지만 해도 String 객체는 내부적으로 char[] (2byte UTF-16 인코딩)을 사용함 Java9부터 Compact Strings 기법을 도입. byte[] + coder 플래그를 사용해서 1byte 문자 저장해서 메모리 절약→ 한글이나 중국어같은 다국어는 UTF-16(2byte) 유지, 영어나 숫자는 1byte로 저장Heap 공간을 적게 차지해서 GC 성능 최적화작은 크기의 문자열을 더욱 빠르게 처리..

spring 2025. 2. 25. 22:31

추가 정보

인기글

최신글

페이징

이전
1 2
다음
TISTORY
성장을 꾸준히 기록하는 공간 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바