일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 레디스
- APNS
- 성능
- 웹사이트 성능
- redis
- notification
- gcm 푸시 번역
- netty설명
- php
- 푸시 번역
- 자바스크립트
- nginx
- NoSQL
- casandra
- GCM
- nginx설정
- Push
- nginx설치
- 푸시
- 웹사이트성능
- 페이스북 번역
- Java
- 디자인패턴
- git
- GCM 번역
- 웹사이트최적화기법
- Design Pattern
- 페이스북
- Today
- Total
간단한 개발관련 내용
GC(Garbage Colloection)는 언제 발생할까? 본문
예전 블로그 복사 - http://blog.daum.net/7dbwnckd/4696550
GC(Garbage Colloection)는 언제 발생할까?
1. GC의 원리
- 메로리 할당
- 사용 중인 메모리 인식
- 사용하지 않는 메모리 인식
- JVM의 메모리는 크게 클래스 영역, 자바 스택, 힙, 네이티브 메소드 스택 4개 영역으로 나뉘지만, 가비지 컬렉터가 인식하고 할당하는 자바의 메모리 역역에 대해 공부하자!!(힙)
Young, Old, Perm(permanent)의 세 영역으로 나누어지는데,
Young 영역은 Eden, Survivor1, Survivor2
Old 영역은 메모리영역
* 일단 메모리에 객체가 생성되면, Eden영역에 객체가 지정된다. Eden영역에 데이터가 어느 정도 쌓이면, 이영역에 있던 객체가 어디론가 옮겨지거나 삭제된다. 이 때 옮겨지는 위치가 Survivor영역이다. 우선순위는 없으며 두 개의 영역 중 한 영역은 반드시 비어 있어야 한다. 그 비어 있는 영역에 Eden 영역에 있던 객체가 할당된다. 할당된 Survivor 영역이 차면, GC가 되면서 Eden 영역에 있는 객체와 꽉 찬 Survivor 영역에 있는 객체가 비어 있는 Survivor 영역으로 이동한다. 그러다가 더 큰 객체가 생성되거나, 더 이상 Young 영역에 공간이 남지 않으면 객체들은 Old 영역으로 이도하게 된다.
2. GC의 종류
- 마이너 GC : Young 영역에서 발생하는 GC
- 메이저 GC : Old 영역이나 Perm 영역에서 발생하는 GC
이 두 가지 GC가 어떻게 상호 작용하느냐에 따라서 GC 방식에 차이가 나고, 성능에도 영향을 준다. GC가 발생하거나 객체가 각 영역에서 다른 영역으로 이동할 때 애플리케이션의 병목이 발생하면서 성능에 영향을 주게 된다. 그래서 핫 스팟(Hot Spot) JVM에서는 스레드 로컬 할당 버퍼(TLABs: Thread-Local Allocation Buffers)라는 것을 사용한다 이를 통하여 각 스레드별 메모리 버퍼를 사용하면 다른 스레드에 영향을 주지 않는 메모리 할당 작업이 가능해진다.