Heap Area : new 키워드로생성된객체와배열이생성되는영역, ( jdk 8 이상 : static 변수, string 상수풀)
자바에서는 크게 영역으로 2가지로 나누는데, Young 과 Old 영역으로 나눈다.
Young 영역: 생성된지 얼마 되지 않은 객체들을 저장하는 장소(시간이 지남에 따라 우선순위가 낮아지면 Old 영역으로 옮겨짐)
Old 영역 : 생성된지 오래된 객체를 저장하는 장소
Perm 영역 : Class, Method 등 코드가 저장되는 영역으로, JVM에 의해 사용된다.
Eden 영역은자바객체가생성되자마자저장되는장소입니다. JVM이 메모리를 관리하는 방식- Minor GC, FULL GC
New/Young 영역의 GC를 Minor GC라고하고, Old 영역의 GC는 Full FC라고합니다.Minor GC는 자주 일어나기 떄문에 GC에 걸리는 시간이 짧은 알고리즘을 선택하는 것이 적합하다.
Full GC는 속도가 매우 느리며, Full Gc가 일어나는 도중 순간적을 자바 애플리케이션이 멈춰버리기 때문에, Full Gc가 일어나는 정도와 시간은 애플리케이션의 성능과 안전성에 큰 영향을 미침.Minor gc < Major Gc 메모리가 더 많이 차지하고, 대부분 Gc 튜닝은 major Gc에서 일어남.
GC 튜닝 목표의 핵심 : Minor GC 보다 Stop the world 시간이 긴 Major GC 관리
1.Old 영역으로 넘어가는 객체의 수 최소화하기. Young영역 조절
2.Full GC 시간 줄이기. Old 영역 조절
1. Default GC
기본적인 GC 방법으로Minor GC에서 Copy & Scavenge 알고리즘을사용하고, Full GC에서 Mark & Compact 알고리즘을사용하는방법입니다.
Copy & Scavenge
Minor GC가발생하면Eden과 Survivor1의활성객체를 Survivor2로복사하고, Eden과 Survivor1 영역을비웁니다.
다음 Minor GC가발생하면 Eden과 Survivor2의활성객체를 Survivor1로복사하고, Eden과 Survivor2 영역을비웁니다.
Java 8 이후부터는 PermGen 영역이 Metaspace 영역으로변경되면서기존에관리되던 Static 데이터나 String Constant Pool은 Heap 메모리로이동하게되었고클래스의메타데이터만 Metaspace로이동하게되었다. Metaspace 영역은네이티브메모리에서관리하므로 -XX:MaxPermSize를통해서관리되는데이터양에따라유동적으로관리할수있게되었다.
* JVM의 피연산자 스택은 피연산자를 4 Bytes 단위로 저장한다는 것이다. 즉, char나 short와 같이 int보다 작은 자료형의 값을 계산하면 int형으로 자동 형 변환되어 연산이 수행된다.
* 원시 타입은 스택 영역에 존재한다. 반면 참조 타입은 스택 영역에는 참조 값만 있고, 실제 값은 힙 영역에 존재한다. 참조 타입은 최소 2번 메모리 접근을 해야 하고, 일부 타입의 경우 값을 필요로 할 때 언박싱 과정(ex. Double → double, Integer → int)을 거쳐야 하므로 원시 타입과 비교해서 접근 속도가 느린 편이다.
* Method Area(Static Area)은 초기 로드 필요한 정보들 즉 필요한 패키지 클래스, 인터페이스, 상수, static변수, final 변수, 클래스 멤버 변수 등로드된 후 메모리에 항상 상주하고 있는 영역입니다. Stack Area는 클래스 안 메서드 실행 시 해당 영역이 할당되며 메서드에서 직접 사용할 지역 변수, 파라미터, 리턴 값, 참조 변수일 경우 주소 값들이 저장됩니다. Heap Area은 메서드 안에서 사용되는 객체들을 위한 영역으로 new를 통해 생성된 객체, 배열, immutal 객체 등의 메모리와 값이 저장됩니다.