롸?
static과 JVM 메모리 구조 본문
정적 멤버와 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 구조
Runtime Data Areas
-
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을 저장
-
메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
-
기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
-
참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
-
참고
'프로그래밍 > 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 |