Category (227) 썸네일형 리스트형 JVM 영역의 기본 개념과 GC (24.06.19) JVM 영역 정리JVM은 크게 여러 메모리 영역으로 나눌 수 있다. 각 영역은 특정 목적을 가지고 있으며, 효율적인 메모리 관리를 위해 사용된다. 주요 메모리 영역은 다음과 같다 HeapYoung GenerationEden Space: 객체가 처음 생성되는 공간이다.Survivor Space: Eden에서 살아남은 객체들이 이동하는 공간이다. S0(Survivor 0)와 S1(Survivor 1) 두 개의 영역으로 나뉜다.Old Generation: Young Generation을 거쳐 오래 살아남은 객체들이 이동하는 공간이다.Metaspace클래스 메타데이터를 저장하는 공간이다. JVM 8부터 PermGen이 제거되고 Metaspace로 대체되었다.Stack각 스레드마다 별도로 존재하며, 메서드 호출.. [인덱스] 순차 증가 값은 항상 효율적인가? (24.06.12) 궁금증b-tree 기반의 인덱스에서, '삽입' 연산에서 일반적으로 순차적으로 증가하는 값이 성능상 이점이 있다고 알고 있다.그런데, 이는 Auto-increment같은 옵티마이저가 메타데이터를 통해 예측한 값들이 중점이 되는 이유를 들을 수 있었다. (이는 데이터가 증가할 것을 예상할 수 있기 때문에, 노드에 값을 삽입할 때 빠르게 넣을 수 있게 '예측'할 수 있다.)만약 데이터가 '아무런 메타데이터가 없지만', 실제로는 외부 로직에 의해 항상 순차적으로 증가하는 값이라고 할 때(즉, 옵티마이저는 값을 예상할 수 없지만 실제로는 항상 순차적으로 증가하는 값일때) 이것은 완전한 '랜덤 난수' 에 비해 삽입 측면에서 이점이 있을까?순차적으로 증가하는 값의 장점 : 리프 노드 분할 감소B-tree 인덱스는 데.. GC - Major, Minor 가비지 컬렉션에 대한 정리 (24.06.05) 개념Minor GC와 Major GC는 JVM의 가비지 컬렉션에서 중요한 역할을 하는 두 가지 유형의 가비지 컬렉션 이벤트이다. 이 두 가지 GC의 차이점과 동작 방식을 자세히 설명하겠다.Minor GC개요:Minor GC는 Young Generation에서 발생하는 가비지 컬렉션이다. Young Generation은 Eden 영역과 두 개의 Survivor 영역(S0, S1)으로 구성된다.동작 방식:Eden 영역이 가득 찰 때 발생:새로운 객체가 주로 Eden 영역에 할당된다. Eden 영역이 가득 차면 Minor GC가 발생한다.생존 객체 이동:Minor GC 동안, Eden 영역의 모든 객체가 검사된다. 살아남은 객체는 Survivor 영역(S0 또는 S1)으로 이동한다.하나의 Survivor 영역.. Opentelemetry 대표적 수집 metric 정리 (24.05.28) Heap Memory (jvm.memory.used)요약PS Old Gen (Permanent Space Old Generation)역할: 오래된 객체를 저장하는 공간이다.상세 설명:Old Gen 또는 **Tenured Gen**으로도 불린다.대부분의 객체는 생성 후 곧바로 소멸되지만, 오랫동안 참조되는 객체는 **Old Gen**으로 이동한다.Old Gen 영역에서 객체가 차지하는 메모리가 많아지면 Full Garbage Collection(Full GC)이 발생하여 오래된 객체들을 정리한다.Full GC는 응답 시간이 길어질 수 있기 때문에, **Old Gen**의 메모리 사용량을 모니터링하는 것이 중요하다.PS Survivor Space역할: 새롭게 생성된 객체들이 일시적으로 머무르는 공간이다.상세.. EntityManager와 @PersistenceContext (24.05.23) EntityManager는 Bean으로 관리되는 싱글톤 객체이지만, 이것 자체를 사용할 수는 없다. 그 이유는 생성자 주입으로 이것을 사용한다고 해도, 여러 클래스에서 공유항 사용한다면 트랜잭션 간 내부 데이터가 꼬일 가능성이 높기 때문이다. (데이터 중복 및 무결성에 문제)@PersistenceContext를 사용한다면 이 EntityManager의 Bean 객체의 '프록시'를 만들게 된다. 각각의 트랜잭션마다 이 프록시 객체를 할당함으로써, 여러 트랜잭션이 동시에 실행되더라도 EntityManager 내부에서 관리되는 데이터의 무결성을 보장할 수 있게 된다. 각각의 트랜잭션이 독립적인 EM 프록시를 할당받기 때문이다.정리EntityManager는 Bean으로 관리되는 싱글톤 객체이지만, 이것 자체를 .. gradle heap 초과 시 해결 방법 (Expiring Daemon because JVM heap space is exhausted) (24.05.21) Spring 프로젝트를 빌드할 때 Gradle이 메모리 부족으로 인해 실패하는 경우, JVM 힙 메모리를 늘려 문제를 해결할 수 있다. Starting Gradle Daemon...Gradle Daemon started in 5 s 435 ms> Task :compileJavaExpiring Daemon because JVM heap space is exhaustedDaemon will be stopped at the end of the build after running out of JVM memoryExpiring Daemon because JVM heap space is exhaustedExpiring Daemon because JVM heap space is exhaustedExpiring Da.. 부하 증가에 따른 로드 밸런싱 정책 고려 (Envoy) (24.06.20) 개요현재 자체적으로 개발한 Collector 서버에서 수집하는 데이터가 많아질 때면, OOM이 발생하고는 한다. (특히 수집하는 타겟 서버에서 갑자기 많은 부하가 일어날 경우, 급작스러운 데이터 증가로 인해 발생하는 일이다.)Major GC를 막을 수는 없지만(자연스러운 현상이니), 문제는 ‘갑작스럽게 허용 수치 이상의 많은 데이터가 들어올 경우 서버가 멈춰버리는 빈도가 꽤 커진다는 것. 이를 위해 Memory Leak 등을 측정하고자 MAT로 힙 덤프를 떠서 분석했었지만, 근본적으로 막을 수 없는 JPA 관련 인스턴스나 캐시 등은 어쩔 수가 없다 (Query Cashe Plan이나.. 기본적으로 매핑에 사용되는 준비된 persistEntity 등.. ). 서버의 멈춤 현상을 막기 위해 할 수 있는 건 .. Eclipse MAT 전체 Heap 사용량 보기 / 메모리 분석 (24.06.18) 현재 온보딩중인 서버의 Memory Leak을 보기 위해 heap dump를 뜬 뒤, 분석한 overview 값과 실제 APM 및 프로세스 상의 JVM Heap Used가 일치하지 않는다. MAT의 Heap Overview 294.1MB 하지만 Pinpoint 및 외부 APM의 경우 한결같이 600-700MB의 Heap 사용을 이야기하고 있다.이렇게 차이가 날 이유가 없는데.. 실제로 검색을 조금 해본 결과, 다음과 같은 설정을 해주지 않아서 벌어진 문제였다.문제 원인 및 해결 방법1. Eclipse MAT 설정 변경MAT에서 기본적으로 도달할 수 없는 객체는 분석에 포함되지 않는다. 이를 포함하려면 설정을 변경해야 한다.MAT 실행:Eclipse Memory Analyzer (MAT)를 실행한다.Pre.. 이전 1 2 3 4 5 6 ··· 29 다음