JVM 이란
자바 가상 머신으로서, 컴파일 된 바이트 코드를 기계어로 변환하고 메모리관리와 가비지 컬렉션을 수행합니다.
또한, JAVA와 OS(운영체제) 사이에서 중개자 역할을 하며 자바가 os에 구애받지 않고 독립적으로 작동하게 해줍니다.
런타임 데이터 영역 (Runtime Data Area)
JVM의 메모리 영역, 자바 애플리케이션을 실행할 때 사용되는 데이터들 적재하는 영역이다.
자바의 실행과정
- .java파일이 javac 컴파일러를 통해 .class 바이트코드로 컴파일된다.
- Class Loader를 통해 .class 파일들을 JVM에 올린다
- JVM에 있는 .class 파일들을 Execution Engine의 Interpreter와 JIT Complier를 통해 해석된다
- 해석된 바이트 코드는 런타임 데이터 영역에 배치되어 실질적인 수행이 이루어진다
메소드 영역 (Method Area)
메소드의 바이트 코드, static변수가 적재되는 공간이다. JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
Class 영역, static 영역이라고도 한다.
자바 바이트 코드(.class) 란?
자바 가상 머신(JVM)이 실행하는 명령어의 집합
메소드 영역은 JVM 클래스 로더에 의해 컴파일된 바이트 코드들이 로드되는 공간으로
- 자바 프로그램은 먼저 .java파일을 javac 컴파일러를 통해 .class 바이트코드로 컴파일한다.
- JVM은 컴파일된 바이트코드를 JVM 메모리의 메소드 영역에 로드함으로써 자바 프로그램을 실행합니다.
힙 영역 (Heap Area)
모든 스레드가 공유하는 영역으로 객체가 생성되는 영역이다. 생성된 인스턴스들이 런타임시 동적으로 할당되는 메모리 공간이다. new 연산자로 생성되는 클래스, 인스턴스 변수, 배열 타입 등 Reference Type이 저장되는 곳이다.
힙 영역에 생성된 객체와 배열은 Reference Type으로서, JVM 스택 영역의 변수나 다른 객체의 필드에서 참조된다. 즉, "힙"의 참조 주소는 "스택"이 갖고 있고, 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있는 것이다.
만일 참조하는 변수나 필드가 없다면, JVM은 쓰레기 수집기인 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거한다.
스택 영역 (Stack Area)
스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들(지역변수, 매개변수)이 저장되는 영역이다. 각 스레드의 고유한 공간이다.(메소드, 힙 영역과의 차이점)
Stack은 마지막에 들어온 값이 먼저 나가는 LIFO(선입후출) 구조로 push와 pop 기능 사용방식으로 동작한다.
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성되고 메서드 안에서 사용되는 값들을 저장한다. 그리고 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 그리고 메서드 수행이 끝나면 프레임별로 삭제된다. (예시: 로컬변수)
주의점
데이터의 타입에 따라 스택(stack) 과 힙(heap)에 저장되는 방식이 다르다.
기본타입 변수는 "스택 영역" 에 직접 값을 가진다. 참조타입 변수는 "힙 영역" 이나 메소드 영역의 객체 주소를 가진다.
참조변수
참조 타입에는 배열, 열거, 클래스(String), 인터페이스가 있다. 기본타입에는 int, long, char, short, byte, float, double, boolean이 있다.
// 기본 타입 변수
int a = 10;
//참조 타입 변수
String n = "abcd";
기본타입은 실제 값을 변수에 저장, 참조타입은 메모리의 주소값을 변수에 저장
String s = "a";
String s1 = "a";
String s2 = new String("a");
s == s1 // true
s == s2 // false
s1 == s2 // false
s, s1에는 "a" 메모리 주소 값이 할당 되어있다.
Null
참조타입 변수는 객체를 참조하지 않는다는 뜻으로 null 값 가질 수 있다.
null로 초기화된 참조 변수도 스택 영역에 생성이 된다.
https://backendcode.tistory.com/161#head1
[IT 기술 면접] JVM (자바 가상 머신) 이란?
이번에는 JVM에 대해 정리할 것이다. ▶ JVM 이란? JVM이란 Java Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다. (가상 머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한
backendcode.tistory.com
☕ JVM 내부 구조 & 메모리 영역 💯 총정리
저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언
inpa.tistory.com
https://brownbears.tistory.com/519
[Java] 참조 타입과 참조 변수
기본 타입과 참조 타입자바는 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 분류됩니다. 데이터 타입기본 타입참조 타입정수 타입 배열 타입byte열거 타입char클래스short인터페이스int
brownbears.tistory.com
https://velog.io/@syleemk/Java-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
[Java] 메모리 구조
Java는 .java 파일을 바이트코드로 컴파일한 후, 이를 JVM 위의 Runtime Data Area에 올려서 실행시키기에 OS 독립적으로 개발할 수 있다는 것은 다들 잘 알고 있을 것이다. 자바의 메모리 구조를 공부하
velog.io
'Java' 카테고리의 다른 글
[Java] 패키지(package) 존재 이유는? (0) | 2023.05.14 |
---|---|
[Java] this. 와 this() / 생성자 (0) | 2023.05.12 |
BufferedReader & BufferedWriter (0) | 2023.02.06 |
[Java/자바] stream, map, collect (0) | 2023.02.06 |
extends와 implements 차이 (0) | 2023.02.01 |