*설명하기에 앞서 JVM은 이 페이지에서 설명하는 것보다 복잡한 구조를 가지고 있음을 안내드립니다.
Class / Heap / Stack 으로 나누어 코드의 흐름이 JVM에서 구조를 따라 어떻게 흘러가는 지 간단히 정리했습니다.
JVM 은 자바 코드를 컴파일해(javac) 바이트코드(0과 1)로 만들어 어떤 OS에서든 작동할 수 있게끔 만듭니다. 변환된 바이트코드는 .class 파일에 저장되구요. JVM의 Class Loader를 통해 메모리영역을 Load합니다.
실제 메모리영역은 위에 제가 만든영역보다 복잡하지만 이 페이지에서는
- Method Area ( = Class Area)
- Heap
- Stack
으로 분류해 설명하겠습니다.
1. Method Area ( = Class Area)
JVM이 시작(프로그램실행)과 함께 생성되는 공간.
public class name {
final static int classVarialbe = 0;
public static int methodname() {
return 0;
}
}
Staitc 을 Class 소속이라고도 합니다. 이유는 Class와 같이 프로그램 시작시 제일 먼저 실행되기 때문이죠.
변수명에 Class를 붙일 수는 없으니까? static 이란 단어를 사용하지 않을까..합니다.
따라서 static 변수보다는 cv : Class Variable 클래스 변수로 불립니다.
- Class
- static method ( = Class Method)
- static variable ( = Class Variable)
프로그램 시작부터 끝까지 존재합니다. 따라서 어느 영역에서든 사용이 가능합니다.
하지만 처음부터 끝까지 메모리영역을 차지 하기 때문에 평소에는 static method를 잘 사용하지 않습니다.
보통 유틸 Util 같은 기능모음 Class 같은 경우에만 static method를 볼 수 있습니다.
2. Heap
객체(instance)와 배열을 처리하는 공간입니다.
ClassName cn = new ClassName(); // 인스턴스 instance
String[] arrayStr = null; // 배열 array
이렇게 클래스로부터 객체를 만드는 것을 인스턴스(객체) 라고 합니다.
java의 특징인 GC(garbage collector)의 대상이 되는 메모리공간이 바로 Heap입니다.
Garbage Collector ( GC ) 란?
새로운 변수명이 붙지 못한 인스턴스값들은 자바가 알아서 Garbage Collector(GC)에 모아 주기적으로 삭제합니다.
*사실 자바는 코드로 객체를 직접 제거하는 방법을 제공하지 않습니다.
3. Stack
금방 사용되고 금방 사라지는 데이터가 저장되는 곳.
- 기본타입 변수
- 지역변수Local variable
- 매개변수 parameter
- 인스턴스변수 instance value
정확히는 클래스를 인스턴스화 해서 힙영역에 저장해 사용하는 것
정리
조금 헷갈리지만 다시 정리해 보자면
package test;
public class TestPage {
public static void main(String[] args) {
Tv t = new Tv();
t.tvVal = 0;
}
}
class Tv{
int tvVal;
}
- Tv t 에서 Tv는 타입 을 나타낸다.
인스턴스를 만들 때도 String str = a; int i = 0; 처럼 타입을 적는 겁니다. - 여기서 t는 참조변수 (리모콘 같은) 역할.
이때 참조변수 t는 Heap 영역에 저장됩니다. - new Tv는 클래스를 인스턴스화 한 객체.
Tv라는 클래스를 new를 붙여 복사해 인스턴스화한 객체라고 보시면 됩니다. - = 대입연산자로 객체(new Tv)를 참조변수 t에 연결 해 사용한다.
💡 java에서 객체는 참조변수 (Heap이나 Method Area 이용) 없이 사용할 수 없다
'☕ 자바 JAVA > ☕ 개발환경' 카테고리의 다른 글
아주 간단하게 설명한 개발환경. JVM, JRE, JDK (0) | 2023.01.01 |
---|