반응형
JVM
- 자바 가상 머신
- 자바 컴파일러로 .java파일을 컴파일한 .class() 바이트코드를 OS에 맞게 실행해 주는 프로그램
- JIT, 운영체제에 영향을 받지 않고 돌아가기 때문에 플랫폼에 의존하지 않을 수 있다.
- 가비지 컬렉션를 수행한다.
자바 메모리 영역
- 메소드(클래스, 스태틱(정적)) 영역
- 하나의 JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다. 그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다. Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다. 다르게 말하면 전역변수가 프로그램이 종료될 때까지 어디서든 사용이 가능한 이유이기도 하다. 따라서 전역변수를 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있어 필요한 변수만 사용할 필요가 있다
- 스택 영역
- 우리가 현재까지 작성하던 메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack(스택) 영역이다. 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.
- 힙 영역 (GC 대상)
- 인스턴스를 생성하는 방법은 "클래스 변수 = new 클래스();" 라는 것.
- 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다.
- 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된
Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다. - 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다. 이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.
GC란?
- 가비지 컬렉션은 더이상 필요하지 않은 메모리를 정리해주는 프로그램을 말한다.
- JVM에서는 힙영역에서 사용하지 않는 객체를 삭제하는 과정을 말한다.
- 가비지컬렉션은 동적으로 할당한 메모리 영역중 사용하지 않은 영역을 탐지하여 해제하는 기능
GC 수거 대상 (Reachability)
- 가비지 컬렉션이 동작할 때 객체가 참조하고 있으면 mark를 하며 마킹되지 않은 객체는 sweep 대상이 된다.
- 참조 안한다는 것은 String a = null; 같은 경우를 말한다.
힙 메모리 구조
- Young 제너레이션
- eden
- Survivor space 1
- Survivor space 2
- old 제너레이션
- permanent 영역
구조를 나눈 이유
- 대부분의 객체는 금방 접근 불가능한(unreachable) 상태가 된다
- 즉 금방 garbage가 된다.
- 오래도니 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
- 즉, 새로 생성된 객체가 메모리에 많이 차지한다.
가비지 컬렉션 과정 (mark and sweep Compact)
- 어떠한 새로운 객체가 들어오면 Eden에 할당한다.
- Eden space가 가득차게 되면 miner GC가 시작된다.
- Mark 된 (참조되는 객체) 것은 Survivor으로 이동되어지고, 아닌 것(참조되지 않는 것) 삭제된다.
- Survivor는 순서가 정해지는 것이 아니라 GC 과정에서 스위칭되며 비어있는 Survivor가 반드시 존재해야된다.
- 한번의 miner GC 과정에서 살아남으면 age가 증가한다.
- 특정한 임계값이 넘어가면 Old 제너레이션으로 넘어간다.
- Old 도 마찬가지로 가득차게 되면 Major GC가 수행되고 그 후 Compact 과정이 일어난다.
Stop the world
- GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
- Gc를 실행하는 스레드왜 모든 스레드가 작업을 중단한다
GC 방식
- Serial GC (스레드가 1개)
- Parallel GC
- 자바8의 default GC
- Young 영역의 GC를 멀티스레드로 수행
- G1 gc
- G1 GC의 가장 큰 장점은 성능이다.
- 자바 9버전 이후에 사용됨
'프로그래밍 > 스프링 자바' 카테고리의 다른 글
[스프링 시큐리티] 스프링 시큐리티 + Jwt 흐름 알기 (0) | 2021.07.12 |
---|---|
TDD 방식으로 개발 예제 (Junit5) (0) | 2021.07.04 |
[Spring] 스프링 개념 정리 (0) | 2021.06.30 |
객체 지향 프로그래밍이 정리 (OOP 정리) (0) | 2021.06.28 |
JUnit5 정리 (0) | 2021.06.28 |