-
JVM이란, Java Virtual Machine의 약자이며 자바 가상 머신이라고 한다.
Java의 바이트 코드를 해석하고 실행한다.
어떤 운영체제든 JAVA 파일을 실행할 수 있다.
자바 프로그램 실행하면 jvm은 OS로부터 메모리를 할당 받는다.
할당받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용한다.
메모리를 관리하지 않고 구성하게되면 StackOverFlow 가 발생하여 어플리케이션이 종료되거나 속도 저하가 된다.
JVM순서
1. .java -> 컴파일러를 통해 .class 파일로 변환
2. .class 파일을 JVM의 ClassLoader에게 보낸다
3. 클래스로더에서 jvm런타임 영역으로 로딩(할당!)해 메모리에 올린다.
JVM의 RUNTIME DATA AREA
클래스 로더가 이 영역에 .class영역을 올린다.
런타임 데이터 영역에는
1. Static Area (Method Area)
2. Stack Area
3. Heap Area
4. PC Register
5. Native Method Stack
jvm 메모리는
힙영역 스택영역 스태틱영역(메소드영역 java8 부터 메타스페이스영역)으로 되있다.
* 변수
클래스변수 - 스택 메모리
클래스가 메모리에 올라갈때 로딩될때~프로그램종료시
인스턴스변수 -힙 메모리
인스턴스가 생성~소멸될때
지역변수 - 메서드 내부에 선언 -블록실행될 때
1. 메소드영역(=메타스페이스영역/스테틱영역)
- JVM이 동작해 클레스가 로드될 때 생성되며
클래스 변수, static으로 선언된 것들, 생성자와 메서드, 클래스정보가 할당된다.
- 런타임 상수풀은 메서드 영역에 클래스가 정보가 로드될 때 생성된다.
런타임 상수 풀에는 런타임에 해석되는 메서드와 필드의 참조 등 여러 종류의 상수가 저장되어있다.(?)- 모든 쓰레드에서 공유된다.
- 공간 부족 시 OutOfMemory
2. JVM 스택영역
- 각 쓰레드마다 스택공간을 가진다.
- 메소드가 호출될 때 생성되는 메모리공간(스택프레임)이 할당 [하나의 메서드 당 하나의 스택프레임(메서드공간)]
- 기본자료형(원시자료형) 값, 지역변수, 파라미터, 리턴값
- Heap영역에 생성된 Object 타입의 객체변수 값(참조변수)이 할당된다.
- LIFO (PUSH/POP)
3. 힙영역
- 객체의 생명주기를 관리하는 메모리
- 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.
- 호출이 끝나도 소멸되지 않고 어떤 참조변수도 참조하지 않을 때 GC에 의해 청소된다.
- 참조형 데이터 타입의 모든 값
- 모든 쓰레드에서 공유된다.
그림으로 정리해보기 그림보고 다시 말하자면,
* 메소드영역의 런타임 상수풀은 클래스/인터페이스의 메소드,필드,문자열상수 등의 레퍼런스가 저장된다.
* 각 쓰레드마다 JVM 스택이 생성된다.
* 하나의 메서드당 하나의 스택 프레임이 생성된다.
* 현재 함수에서 호출된 함수는 스택의 맨 위에 푸시된다.
* 함수가 반환되면 해당 프레임이 스택에서 제거된다.
소스로 알아보기
public class Animal { public static String animal = "동물"; static int i = 10; private final int j = -10; String name; int leg = 0; Animal(String name, int leg){ this.name = name; this.leg = leg; } public static void main(String[] args) { int lv = 30; double lv2 = 0.3; String lStr = "모든 동물은 귀엽다."; Animal animal = new Animal("동물",4); animal.say(lStr); Cat cat = new Cat("냥냥이", 4); cat.say("냐옹"); } public void say(String param){ System.out.println(param); } } class Cat extends Animal { static int ci = 20; private final int cj = -20; public static String kind = "고양이"; Cat(String name, int leg){ super(name, leg); } }
01234567890123456789101112참조
https://www.youtube.com/watch?v=frKHrnsCoS4&t=616s
https://coding-factory.tistory.com/830
https://yaboong.github.io/java/2018/05/26/java-memory-management/