☕ 자바 JAVA/☕ 개발환경

[JAVA]단순히 정리한 JVM구조와 Memory(+ static)

yeun.log 2023. 1. 8. 22:41
반응형

*설명하기에 앞서 JVM은 이 페이지에서 설명하는 것보다 복잡한 구조를 가지고 있음을 안내드립니다.

Class / Heap / Stack 으로 나누어 코드의 흐름이 JVM에서 구조를 따라 어떻게 흘러가는 지 간단히 정리했습니다.

JVM의 아주 간단한 구조

JVM 은 자바 코드를 컴파일해(javac) 바이트코드(0과 1)로 만들어 어떤 OS에서든 작동할 수 있게끔 만듭니다. 변환된 바이트코드는 .class 파일에 저장되구요. JVM의 Class Loader를 통해 메모리영역을 Load합니다.

 실제 메모리영역은 위에 제가 만든영역보다 복잡하지만 이 페이지에서는

  1. Method Area ( = Class Area)
  2. Heap
  3. Stack

으로 분류해 설명하겠습니다.


1. Method Area ( = Class Area)

JVM이 시작(프로그램실행)과 함께 생성되는 공간.

public class name {

	final static int classVarialbe = 0;
    
    public static int methodname() {
    	return 0;
    }
}

 

StaitcClass 소속이라고도 합니다. 이유는 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 이용) 없이 사용할 수 없다

 

반응형