📝느낀 점
JVM을 공부하면서 static primitive 같은 경우는 메타스페이스 영역에 저장 되는 것을 알고 있었으나, static reference 같은 경우는 어디에 저장 되는건지 궁금하였다! "static이기에 분명 메타스페이스 영역에 저장 될거야" 라고 생각했지만, "참조형인데 객체 생성은 해야 될거 아냐?" 뭐지?? 싶은 생각에 혼란스러웠던 기억에 이렇게 정리하게 되었다. 생각해보면 내가 jvm에 대해 지식이 아예, 없었다면 이해를 하고 싶어도 이해를 할수 없었지 않았나 싶다. 이래서 다들 깊게 공부하라고 하는 것이구나 싶은 생각이 든다. 어떤 하나를 깊이 공부하고 나면 분명 다른거와 연관되어 생각이 나게되고 "아, 그래서 이렇게 되는거구나" 하고 알게 되는 것 같다. 중요한 것은 static reference는 객체 생성은 힙 영역에서 하게 되고, 그 참조 값은 메타스페이스 영역에서 하게 되는 것이다. 원래 같으면 jvm 스택 영역에서 관리 했겠지만, static이기에 메타스페이스 영역에서 하게 되는 것이다.
metaspace영역
java8부터 생긴 영역이다. Metaspace는 클래스 메타데이터 및 클래스 정보를
저장하는 영역으로, 클래스로더가 클래스를 로드하고 메타데이터를 저장하는 곳이다.
java8부터는 static을 heap영역에서 관리한다
여기서, 오해 하면 안되는 것은 → static object를 말한다.
- static객체는 heap영역에 저장
- 하지만reference는 여전히 metaspace에서 관리된다.
- 그렇기 때문에 참조를 잃은 static object는 GC의 대상이 될 수 있다.
static int i = 1;
static void a() {
}
static A a = new A(); // reference 형식의 static field
static 메서드와 일반 메서드의 차이점
static 메소드와 인스턴스 메소드의 차이는 인스턴스를 생성하는가, 하지 않는가의 차이로 나뉜다고 본다.
차이점은?
static 메소드는 인스턴스 변수, 메소드를 호출할 수 없지만,
인스턴스 메소드는 static 변수, 메소드를 호출할 수 있다는 것이다.
궁금증!
왜 static 메소드는 인스턴스 멤버인
"인스턴스 변수", "인스턴스 메소드"를 사용할 수 없을까?
이유는
인스턴스 메소드를 이용하려면 인스턴스 변수를 사용하므로 객체 생성이 필요하다
그러나 static 메소드는 항상 호출이 가능해야 하는데, 객체가 있을지 없을지 모르기 때문이다.
생각해보기
ex1)
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
counter.increment();
}
}
class Counter {
static int count = 0; // 증가 할까?
public void increment() {
count++;
}
}
ex2)
public class Main {
public static void main(String[] args) {
Counter counter1 = new Counter();
counter1.increment();
Counter counter2 = new Counter();
counter2.increment();
System.out.println(Counter.count);
}
}
class Counter {
static int count = 0;
// 메소드에 static 붙여도 동작은 가능하다
// 그렇게 되면, 위에 인스턴스들은 필요 없어지게 되는 것이다
public void increment() {
count++;
}
}
'Java' 카테고리의 다른 글
JIT 컴파일러는 무엇인가요? (0) | 2023.11.07 |
---|---|
배열의 선언과 메모리 할당 (0) | 2023.11.07 |
exception VS error 차이가 무엇인가요? (0) | 2023.11.07 |
불변 객체나 final을 굳이 사용해야 하는 이유가 있나요? (0) | 2023.11.07 |
equals, hashCode 메서드는 왜 사용하나요? (0) | 2023.11.07 |