롸?

static과 JVM 메모리 구조 본문

프로그래밍/JAVA

static과 JVM 메모리 구조

허니버터새우깡 2020. 2. 4. 12:07

정적 멤버와 static

정적(static)은 '고정된'이란 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.

 

  • 선언 및 사용

public class 정적멤버{
   static int a = 0;
   
   static void a() {}
}
public class Use{
	public static void main(String[] args){
		//멤버 변수 사용
		int b = 정적멤버.a;
		
		//정적 메소드 사용
		정적멤버.a();
	}
}




자바 메모리 영역

JVM 구조

https://hoonmaro.tistory.com/19

 

Runtime Data Areas

https://hoonmaro.tistory.com/19

 

  • Method (Static) Area: 코드에서 사용되는 클래스(~.class)들을 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 코드, 생성자 등을 분류해서 저장한다. 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

 

  • Heap Area

    • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

    • New 연산자로 생성된 객체와 배열을 저장한다.

    • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

    • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 Garbage Collector의 대상이 된다.

    • 힙 영역의 사용기간 및 스레드 공유 범위

      • 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시

      • GC(Garbage Collection) 대상

      • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.

      • 모든 스레드에서 공유한다.

 

  • Stack Area

    • 각 스레드마다 하나씩 스택 영역이 존재하며, 스레드가 시작될 때 할당된다. 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나이다.

    • 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.

      • 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 push 되거나 pop 된다.

      • (코드상에서) 변수가 이 영역에 생성되는 시점은 초기화가 될 때이며, 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

      • String 의 경우 참조 변수이므로 각 스택마다 힙영역의 String 객체의 주소값을 저장해야하는데 문자열 리터럴이 같은 경우 String 객체를 공유하도록 되어 있다. 하지만, new 연산자를 사용할 경우는 문자열 리터럴이 같아도 서로 다른 객체의 주소값을 저장한다.

    • 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용

    • 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장

    • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장

    • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.

    • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

 

 


참고 

1.  https://hoonmaro.tistory.com/19

2.  https://programmer-seva.tistory.com/73

'프로그래밍 > JAVA' 카테고리의 다른 글

제네릭(Generic)  (0) 2020.02.04
싱글톤(Singleton)  (0) 2020.02.04
추상(abstract)  (0) 2020.02.04
오버로딩(Overloading)과 오버라이딩(Overriding)  (0) 2020.02.04
객체지향 프로그래밍  (0) 2020.02.04
Comments