JVM 메모리 영역과 static

JinCode96·2023년 4월 9일
0

JAVA

목록 보기
4/8

JVM의 메모리 영역

Method Area (Class Area, Static Area)

  • 정적 영역
  • static-zone과 none static-zone으로 나뉜다.
  • 클래스 코드의 바이트 코드가 로드되는 영역(기계어 코드)
  • 프로그램 실행 중 클래스나 인터페이스를 사용하게 되면, JVM은 Class Loader를 이용해 클래스와 인터페이스의 메타데이터를 Method Area에 저장

Stack Area

  • 메서드가 호출되면 호출된 기계어 코드가 push되고 실행되는 메모리 공간
  • 현재 실행되고있는 상태를 파악할 수 있다.
  • 메서드 내부의 지역변수도 stack에 할당됨.
  • Heap Area에 저장되는 객체의 참조변수 저장
  • PC : 현재 수행중인 프로그램의 위치를 나타낸다.
  • LIFO(Last In First Out) 구조

Heap Area

  • 프로그램이 실행되면서 동적으로 생성된 객체(인스턴스)가 저장
  • stack영역에는 참조변수(인스턴스 변수)만 저장되며 Heap 영역에 실제 데이터가 저장
  • Garbage Collector(GC)에 의해 메모리가 수집

static

메인 클래스는 왜 객체 생성 없이 실행될까?

public class StaticTest{
	public static void main(string[] args){
		System.out.println(“Hello Java”); 
    }
}

메인 클래스가 실행되는 방식

  • JVM이 실행할 클래스를 찾는다. 찾았다면?
  • static 키워드가 붙어있는 멤버들을 정해진 메모리(static-zone) 위치에 한번 자동으로 로딩 한다.
    - static 키워드가 붙어있는 멤버들은 클래스를 사용하는 시점에서 딱 한번 메모리에 로딩
  • JVM이 static zone에서 main()을 호출
  • 호출된 메서드를 Call Stack Frame Area(Stack Area)에 push(기계어코드를 넣고) 한 뒤 동작을 시작한다.

none static 메서드 접근 방법

  • static-zone에 있는 main()메서드가 먼저 실행되고 Heap Area에 객체를 생성
  • 생성된 객체의 hap() 메서드가 none static-zone에 할당되고 Stack Area에 올라옴

요약

  • static 멤버는 클래스를 사용하는 시점에서 자동으로 Method Area의 static-zone에 로딩된다.
  • 따라서 new로 객체를 생성하지 않아도 호출이 가능하다.
  • static 멤버 접근 방법 -> 클래스이름.호출메서드
  • none-static 멤버에 접근하기 위해선 객체를 생성해야한다.
  • 자주 사용하는 메서드는 static으로 선언하여 객체생성 없이 호출하여 사용할 수 있다.
  • 자바 API에는 모든 메서드가 static인 경우 생성자를 private으로 두어 객체생성을 막고있는 클래스도 있다. (System, Math...)

Class, Object, Instance 구분하기

profile
꾸준히 성장하는 개발자

0개의 댓글