티스토리 뷰
먼저 메모리 구조를 공부하는 이유
- 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다
- 메모리 관리가 되지 않을 경우 속도 저하 현상이나 튕김 현상들이 일어날 수 있음
- 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함
메모리 : 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간
Java 프로그램의 실행구조
JVM(Java Virtual Machine)이라는 프로그램만 있으면 실행가능
JVM이 OS로부터 메모리 사용권한을 할당 받고 JVM이 자바프로그램을 호출하여 실행
프로그램이 OS로부터 독립적이지만 JVM에게 종속적(JVM을 실행시키고 다시 JVM이 프로그램을 실행하는 방식이다 보니 OS로 부터 직접 제어 받는 방식보다는 속도면에서 느림)
메모리 구조
스태틱 영역 / 스택 영역 / 힙 영역
1 스태틱영역(Static area)
(클래스 영역 or 메소드 영역 이라고도 불림)
- 필드정보(Field Information) : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
- 메소드 정보(Method Information) : 메소드 이름, 리턴 타입, 매개 변수(파라미터), 접근 제어자에 대한 정보
- 타입 정보(Type Information) : 타입의 속성이 Class 인지 Interface인지 여부, 타입의 이름, 타입 슈퍼클래스 전체이름(Type이 Interface 이거나 Object클래스인 경우 제외), 접근제어자 및 연관된 Interface 전체 리스트 저장
- 상수 풀(Constant Pool) : type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존 상수 사용), 문자, 상수, 타입, 필드. 메소드의 Symbolic reference(객체를 참조하는 것)도 상수 풀에 저장
- 클래스 변수(Class Variable) : 스태틱 변수라고도 불림, 모든 객체가 공유할 수 있고 객체 생성 없이 접근 가능하다
- 클래스 사용이전에 메모리 할당 : final 클래스 변수의 경우 (상수로 치환되어) 상수 풀에 값 복사
2 스택 영역(Stack area)
- Last In First Out
- 메서드 호출 시마다 각각의 스택 프레임이 생성
- 메서드 안에서 사용되어 지는 값들 저장 , 호출 된 메서드의 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시저장
- 메서드 수행이 끝나면 프레임 별로 삭제
3 힙 영역(Heap area)
- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- Garbage Collector를 통해 메모리 변환
Permanent generation
- 생성된 객체들의 정보의 주소값이 저장된 공간
New Area(Young area)
- eden : 객체들이 최초로 생성되는 공간
- survivor : eden에서 참조되는 객체들이 저장되는 공간
Old Area
- New Area에서 일정시간 참조되고 있는 객체들이 저장되는 공간
가비지 컬렉션(Garbage Collection)
가비지(Garbage) 란?
- 응용 프로그램에서 더이상 사용되지 않는 메모리
- 시스템으로 부터 할당받아 사용되다가 현재는 더이상 가르키는 레퍼런스가 없는 메모리
- 무효영역이라고도 함
가비지 컬렉션
- 가비지를 회수하여 사용할 수 있는 메모리 공간을 늘리는 것
- 가비지 컬렉션을 수행하는 쓰레드를 가비지 컬렉터(Garbage Collector)라고 함
- JVM은 가비지 컬렉터 영학을 수행하는 가비지 컬렉션 쓰레드를 두고 있다
- 가비지가 많아지면 상대적으로 프로그램에 할당 해줄 수 있는 가용 메모리의 양의 줄어들기 때문에 가비지 컬렉션 수행
(최악의 경우 더이상 메모리를 할당 할 수없는 상태가 될 수있다 / 그럴 경우가 거의 발생하지 않지만)
가비지 컬렉션 요청
System.gc(); //시스템으로 부터 GC요청
Runtime.getRuntime().gc(); //런타임으로부터 GC요청
가비지 컬렉션 수행순서
- stop-and-world : GC실행을 위해 JVM이 실행중인 application을 중단하는 것
- 참조되지 않은 객체 탐색후 삭제
- 삭제된 객체의 메모리 반환
- heap 메모리의 재사용
가비지 컬렉션의 종류
Minor garbage collection
- new 영역에서 일어나는 가비지 컬렉션
- eden영역에 객체가 가득 차게 되면 첫 번째 가비지 컬렉션 발생
- survivor1영역에 값 복사
- survivor1영역을 제외한 나머지 영역의 객체들을 삭제
- eden 영역과 survivor1영역의 메모리가 기준치 이상일 경우 eden 영역에 생성된 객체와 survior1 영역에 잇는 객체중 참조되고 있는 객체가 잇는지 검사
- 참조되고 있는 객체를 survivor2영역에 복사
- survivior2 영역을 제외한 영역의 객체들을 삭제
- 일정시간이상 참조되고 있는 객체들을 old 영역으로 이동
- 반복
Major garbage collection(Full garbage collection)
- old 영역에 있는 모든 객체들을 검사
- 참조되지 않은 객체들을 한꺼번에 삭제
- 시간이 오래걸리고 실행중 프로세스가 정지
'Development > Java' 카테고리의 다른 글
예외처리(Exception) (0) | 2017.08.24 |
---|---|
컬렉션 프레임워크(Collection Framework) 란? (0) | 2017.08.08 |
Static이란? (0) | 2017.08.02 |
JSP란? (0) | 2017.08.01 |
다형성(Polymorphism) (1) | 2017.06.08 |
- Total
- Today
- Yesterday
- Stack
- HTTP
- mariadb 데이터타입
- mysql 세팅
- 스택
- hash알고리즘
- 스프링 부트 시작 에러
- mariadb데이터 타입
- org.springframework.beans.factory.BeanDefinitionStoreException
- spring boot 시작 에러
- spring boot org.springframework.beans.factory.BeanDefinitionStoreException
- mariadb설치
- 해시알고리즘
- mac db설치
- Data Structure
- 큐
- 알고리즘
- hash algorithm
- mac mariadb
- 자료구조
- 데크
- mac mariadb 설치
- 400 badgateway
- mariadb
- 400 error
- mysql데이터타입
- 스프링 부트 에러
- mysql데이터
- springframewor
- mysql 데이터 타입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |