Item 7 - 다 쓴 객체 참조를 해제하라
다 쓴 객체 참조를 해제하라
Last updated
다 쓴 객체 참조를 해제하라
Last updated
객체지향 언어의 메모리 관리에 대한 이야기
프로그래밍을 하는 동안 메모리를 할당하고 사용하게 되는데 이와 관련된 키워드를 학습하기
학습 키워드
메모리 누수로 인한 장애의 징조
메모리의 구조
Garbage Collection
메모리 누수의 원인
메모리 모니터링
어떤 자료구조를 사용하는 프로그램을 오래 실행하다 보면 점차 가비지 컬렉션 활동과 메모리 사용량이 늘어나 결국 성능이 저하될 것이다.
성능 저하되는 것을 넘어서 디스크 페이징이나 OutOfMemoryError(OOM)을 일으켜 예기지 않게 종료될 수 있다.
Java Source
Java Compiler
Java Byte Code
Class Loader
Runtime Data Area
Garbage Collection
Execution Engine
Method(Static or Class) Area
Runtime Constant Pool
Heap Area
Young Generation
Old Generation
MetaSpace
Stack Area
PC Register
Native Method Stack Area
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
Old Generation 영역의 메모리가 부족한 경우 Major GC 발생
Markng 작업을 통한 구분
Reachable or Unreachable
Sweep 작업을 통한 Unreachable 한 객체들의 메모리 수거
Compact 작업을 통한 메모리 조각 모음
Garbage Collection Trigger
System.gc() or Runtime.getRunTime().gc() 실행 시
JVM이 tenured space에 여유 공간이 없다고 판단하는 경우
Minor GC 중 JVM이 eden 또는 survivor 공간에 충분한 공간을 회수할 수 없는 경우
JVM에 MaxMetaspaceSize 옵션을 설정하고 새 클래스를 로드할 공간이 부족한 경우
Garbage Collection 수거 대상
GC의 메모리 수거 대상
모든 객체 참조가 null 인 경우
객체가 블럭 안에서 생성되고 블록이 종료되는 경우(Scope)
부모 객체가 null 이 된 경우, 자식 객체는 자동적으로 GC 대상이 된다.
객체가 Weak 참조만 갖는 경우
객체가 Soft 참조 이지만 메모리가 부족한 경우
Stack or Method(Static) 에서 참조하지 않는 객체
Java는 메모리를 사용하기 위해 Runtime Data Area에 영역별로 저장한다.
사용 중인 자원을 일반적으로는 GC가 백그라운드에서 관리를 한다.
GC는 Minor GC와 Major GC의 동작을 한다.
GC가 자원을 회수하기 위한 조건은 Stack, Method Area에서 사용하지 않는 자원들이다.
GC는 Unreachable 한 객체는 찾을 수 있지만 Unused 한 객체는 찾을 수 없다. Unused 한 객체는 응용 프로그램의 논리에 따라 달라지므로 프로그래머는 비즈니스 코드에 주의해야 한다.
메모리 누수를 발생할 가능성이 있는 경우
AutoBoxing
Cache
Connection
CustomKey (객체를 구분)
Immutable Key
Internal Data Structure
동적 할당이 일어나는 콜 스택
Java는 메모리를 사용하기 위해 Runtime Data Area에 영역별로 저장한다.
사용 중인 자원을 일반적으로는 GC가 백그라운드에서 관리를 한다.
GC는 Minor GC와 Major GC의 동작을 한다.
GC가 자원을 회수하기 위한 조건은 Stack, Method Area에서 사용하지 않는 자원들이다.
메모리의 누수는 특정 시점에 발생하는 것이 아니라 평소에 관리할 수 있는 방법은 코딩 방법과 모니터링이다.
jstat
jstat 실행 방법
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.
jstat plot 확인 사이트 Link
[Baeldung - Stack Memory and Heap Space in
Java](https://www.baeldung.com/java-stack-heap#:~:text=Stack Memory in Java is,%2DOut (LIFO) order.)