TIL
  • Contents
  • Book
    • 도메인 주도 설계
      • 1. 동작하는 도메인 모델 만들기
    • 오브젝트
      • 데이터 중심 설계
      • 책임 중심 설계
      • 책임 할당을 위한 GRASP 패턴
      • 메시지와 인터페이스
      • 객체 분해
    • Effective Java
      • Item 7 - 다 쓴 객체 참조를 해제하라
      • Item 7 발표 내용
      • Item 13 - clone 재정의는 주의해서 진행하라
      • Item 13 발표 내용
      • Item 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
      • Item 16 발표 내용
      • Item 26 - 로 타입은 사용하지 말라
      • Item 28 - 배열보다는 리스트를 사용하라
      • Item 28 발표 내용
      • Item 29 - 이왕이면 제네릭 타입으로 만들라
      • Item 30 - 이왕이면 제네릭 메서드로 만들라
      • Item 31 - 한정적 와일드 카드를 사용해 API 유연성을 높이라
      • Item 35 - ordinal 메서드 대신 인스턴스 필드를 사용하라
      • Item 37 - ordinal 인덱싱 대신 EnumMap을 사용하라
      • Item 37 발표 내용
      • Item 43 - 람다보다는 메서드 참조를 사용하라
      • Item 43 발표 정리
      • Item 56 - 공개된 API 요소에는 항상 문서화 주석을 작성하라
      • Item 56 발표 정리
      • Item 62 - 다른 타입이 적절하다면 문자열 사용을 피하라
      • Item 62 발표 정리
      • Item 73 - 추상화 수준에 맞는 예외를 던지라
      • Item 83 - 지연 초기화는 신중히 사용하라
      • Item 83 발표 내용
      • Item 89 - 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라
      • Item 89 발표 내용
    • 개발자를 위한 SQL 튜닝
      • SQL 쿼리 실습을 위한 DB 서버 구축
      • 인덱스 튜닝
      • 인덱스 스캔 튜닝
      • 인덱스 스캔 튜닝 실습
      • 인덱스 패스트 풀 스캔
      • 테이블 풀 스캔 튜닝
      • 조인 튜닝
      • 중첩 루프 조인 튜닝
      • 중첩 루프 조인 튜닝 실습
      • 해시 조인 튜닝
      • 해시 조인 튜닝 실습
      • 세미 조인 튜닝
      • 세미 조인 튜닝 실습
      • 아우터 조인
      • 함수 튜닝
      • 부분 범위 처리 튜닝
      • 파티셔닝 튜닝
      • 파티션 인덱스 튜닝
      • 병렬 처리 튜닝
  • Java
    • Design Pattern
      • Intro
      • Types of Design Patterns
      • Creational
        • Builder Pattern
        • Singleton Pattern
        • Prototype Pattern
        • Factory Pattern
        • Abstract Factory Pattern
      • Structural
        • Adapter Pattern
        • Bridge Pattern
        • Composite Pattern
        • Decorator Pattern
        • Facade Pattern
        • Flyweight Pattern
        • Proxy Pattern
      • Behavioural
        • Chain of Responsibility Pattern
        • Command Pattern
        • Interpreter Pattern
        • Iterator Pattern
        • Mediator Pattern
        • Memento Pattern
        • Observer Pattern
        • State Pattern
        • Strategy Pattern
        • Template Method Pattern
        • Visitor Pattern
    • Java
      • Cracking the Coding Interview
      • TDD, Clean Code with Java 11기
        • 자동차 레이싱
        • 로또
        • 사다리 타기
        • 볼링 게임 점수판
    • 궁금증
      • 자바 8 버전의 인터페이스와 추상클래스
      • 자바의 제네릭은 어떻게 이전 버전과 호환되는 걸까?
      • 스프링 MVC 기본 구조
      • 마샬링과 직렬화
      • 인터뷰 질문 모음
      • Code Coverage
  • Database
    • Database
      • SQL 레벨업
      • DB 스터디
        • DBMS
          • MySQL
        • INDEX
        • Join(Nested Loop, Hash)
        • Join(Semi, Outer)
        • Partial Range Processing
        • Function
        • Partitioning
        • Parallel Processing
  • Network
  • Architecture
    • Issue
      • Git Push Error
      • SonarLint Warning - assertThatExceptionOfType()
  • Infra
  • Spring
    • Spring JPA
      • 1. 데이터 모델링 및 연관관계 설정
      • 2. 최적화 내용
      • 3. Spring-Data-Jpa
      • 4. Query DSL
    • Spring Security
      • Intro
    • Spring Batch
      • 배치용 디비 설치
      • 배치 데이터 분석하기
      • 배치 프로세스 구상하기 및 성능 차이 확인하기
  • Issue
  • Tistory
    • Tistory Blog
  • Design High Performing Architectures
  • Design Resilient Architectures
  • Design Secure Applications And Architectures
  • Design Cost-Optimized Architectures
Powered by GitBook
On this page
  • Intro
  • 메모리 누수로 인한 장애의 징조
  • 메모리 구조
  • Runtime Data Area
  • Garbage Collection
  • 중간 정리
  • 메모리 누수의 원인
  • 마무리 정리
  • 메모리 모니터링
  • 참고

Was this helpful?

  1. Book
  2. Effective Java

Item 7 - 다 쓴 객체 참조를 해제하라

다 쓴 객체 참조를 해제하라

PreviousEffective JavaNextItem 7 발표 내용

Last updated 3 years ago

Was this helpful?

  • 객체지향 언어의 메모리 관리에 대한 이야기

Intro

  • 프로그래밍을 하는 동안 메모리를 할당하고 사용하게 되는데 이와 관련된 키워드를 학습하기

  • 학습 키워드

    • 메모리 누수로 인한 장애의 징조

    • 메모리의 구조

    • Garbage Collection

    • 메모리 누수의 원인

    • 메모리 모니터링

메모리 누수로 인한 장애의 징조

  • 어떤 자료구조를 사용하는 프로그램을 오래 실행하다 보면 점차 가비지 컬렉션 활동과 메모리 사용량이 늘어나 결국 성능이 저하될 것이다.

  • 성능 저하되는 것을 넘어서 디스크 페이징이나 OutOfMemoryError(OOM)을 일으켜 예기지 않게 종료될 수 있다.

메모리 구조

  1. Java Source

  2. Java Compiler

  3. Java Byte Code

  4. Class Loader

  5. Runtime Data Area

  6. Garbage Collection

  7. Execution Engine

Runtime Data Area

  1. Method(Static or Class) Area

    • Runtime Constant Pool

  2. Heap Area

    • Young Generation

    • Old Generation

    • MetaSpace

  3. Stack Area

  4. PC Register

  5. Native Method Stack Area

Garbage Collection

1. Minor GC

  • Eden 영역에 메모리 할당

  • Minor GC 동작 트리거

  • Mark 작업

    • Reachable or Unreachable 한 상태의 객체를 확인

    • Reachable 한 객체를 Survivor0 영역으로 이동

  • Unreachable 객체를 GC를 통해 메모리를 수거

  • Survivor0에 저장된 메모리 age 증가

  • 정리

  • eden 영역 공간 부족

  • mark 작업을 통해 Reachable 한 객체를 선별

  • Unreachable 한 객체의 메모리를 수거

  • 선별된 객체를 survivor1 영역으로 이동

  • 이동한 객체 메모리의 aging 처리

  • Max age threshold에 도달한 메모리는 Old Generation으로 이동

2. Major GC

  1. Old Generation 영역의 메모리가 부족한 경우 Major GC 발생

  2. Markng 작업을 통한 구분

    • Reachable or Unreachable

  3. Sweep 작업을 통한 Unreachable 한 객체들의 메모리 수거

  4. Compact 작업을 통한 메모리 조각 모음

Garbage Collection Trigger

  1. System.gc() or Runtime.getRunTime().gc() 실행 시

  2. JVM이 tenured space에 여유 공간이 없다고 판단하는 경우

  3. Minor GC 중 JVM이 eden 또는 survivor 공간에 충분한 공간을 회수할 수 없는 경우

  4. JVM에 MaxMetaspaceSize 옵션을 설정하고 새 클래스를 로드할 공간이 부족한 경우

Garbage Collection 수거 대상

  • GC의 메모리 수거 대상

  • 모든 객체 참조가 null 인 경우

  • 객체가 블럭 안에서 생성되고 블록이 종료되는 경우(Scope)

  • 부모 객체가 null 이 된 경우, 자식 객체는 자동적으로 GC 대상이 된다.

  • 객체가 Weak 참조만 갖는 경우

  • 객체가 Soft 참조 이지만 메모리가 부족한 경우

  • Stack or Method(Static) 에서 참조하지 않는 객체

중간 정리

  1. Java는 메모리를 사용하기 위해 Runtime Data Area에 영역별로 저장한다.

  2. 사용 중인 자원을 일반적으로는 GC가 백그라운드에서 관리를 한다.

  3. GC는 Minor GC와 Major GC의 동작을 한다.

  4. GC가 자원을 회수하기 위한 조건은 Stack, Method Area에서 사용하지 않는 자원들이다.

메모리 누수의 원인

GC는 Unreachable 한 객체는 찾을 수 있지만 Unused 한 객체는 찾을 수 없다. Unused 한 객체는 응용 프로그램의 논리에 따라 달라지므로 프로그래머는 비즈니스 코드에 주의해야 한다.

  • 메모리 누수를 발생할 가능성이 있는 경우

  • AutoBoxing

  • Cache

  • Connection

  • CustomKey (객체를 구분)

  • Immutable Key

  • Internal Data Structure

  • 동적 할당이 일어나는 콜 스택

마무리 정리

  1. Java는 메모리를 사용하기 위해 Runtime Data Area에 영역별로 저장한다.

  2. 사용 중인 자원을 일반적으로는 GC가 백그라운드에서 관리를 한다.

  3. GC는 Minor GC와 Major GC의 동작을 한다.

  4. GC가 자원을 회수하기 위한 조건은 Stack, Method Area에서 사용하지 않는 자원들이다.

  5. 메모리의 누수는 특정 시점에 발생하는 것이 아니라 평소에 관리할 수 있는 방법은 코딩 방법과 모니터링이다.

메모리 모니터링

  • jstat

    • jstat 실행 방법

    # 실행 프로세스 PID 확인
    ps - ef | grep java
    
    # Jstat 명령 수행
    jstat -gcutil {PID} 3s

    gcutil 옵션

    설명

    S0

    Survivor space 0 utilization as a percentage of the space's current capacity.

    S1

    Survivor space 1 utilization as a percentage of the space's current capacity.

    E

    Eden space utilization as a percentage of the space's current capacity.

    O

    Old space utilization as a percentage of the space's current capacity.

    M

    Metaspace utilization as a percentage of the space's current capacity.

    CCS

    Compressed class space utilization as a percentage.

    YGC

    Number of young generation GC events.

    YGCT

    Young generation garbage collection time.

    FGC

    Number of full GC events.

    FGCT

    Full garbage collection time.

    CGC

    The number of concurrent GCs.

    CGCT

    Time spent on concurrent GCs.

    GCT

    Total garbage collection time.

참고

  • [Baeldung - Stack Memory and Heap Space in

jstat plot 확인 사이트

Java](.)

Oracle jstat Options
Link
정리
Baeldung - Java Memory Leaks in Java
https://www.baeldung.com/java-stack-heap#:~:text=Stack Memory in Java is,%2DOut (LIFO) order
Understanding the Java Memory Model and Garbage Collection
마로의 Java(자바) 정리 - 8. 자바 메모리 구조
JVM(Java Virtual Machine)이란
Memory Leaks and Java Code
Demystifying memory management in modern programming languages
Visualizing memory management in JVM(Java, Kotlin, Scala, Groovy, Clojure)
우아한 형제들 - 도움이 될 수도 있는 JVM memory leak 이야기
Jvm Structure
Runtime Data Area
Memory 할당
Eden 영역 메모리 초과
Mark & Sweep
Sweeping 작업
Minor GC 반복 정리
MaxTenuringThreshold
Major GC