728x90
Java 8 이상부터는 Metaspace가 사용된다. 여기에 클래스 정보가 올라간다. 여기서 Java Heap은 JVM이 관리하는 메모리 영역이고, Native Memory는 운영체제가 관리하는 메모리 영역이다.
클래스 파일 정보 자체는 정적이다. 하지만 동적인 것들은 실행되면서 생성되는 것들을 말한다. 따라서 JVM은 사용해야할 클래스의 정보를 읽어들여서 메모리에 올리게 된다. 왜냐하면, 클래스가 저장된 보조 기억장치는 RAM보다 속도가 느려 매번 이곳에서 읽어들이는 것은 성능을 저하시키기 때문이다. 결론적으로 클래스 정보는 처음 사용될 때 메모리에 그 정보를 올리고, 필요할 때마다 사용하게 된다.
예를들어,
Person p1 = new Person();
Person p2 = new Person();
이라는 코드를 JVM이 실행할 때, Person을 처음 만나게 되면 이 클래스를 읽어들여서 그 정보를 메모리에 올린 후 이를 이용해서 인스턴스를 생성한다. 즉, Person p2 = new Person();을 실행할때는 이미 메모리에 올라가있는 Person 클래스 정보를 이용해서 인스턴스를 생성한다.
정리하면, 클래스는 Metaspace에 로딩된다. 그리고 static 정보는 Java 7까지는 non-heap 영역에 저장되었고, Java 8부터는 Heap 영역에 저장된다.
인스턴스 생성
- new 연산자는 사용할 때마다 메모리에 인스턴스가 생성된다.
- 인스턴스는 더이상 참조되는 것이 없을때, 나중에 Garbage Collection이 된다.
- static 필드는 클래스가 로딩될 때 딱 한번 메모리에 올라가고 초기화된다.
- 인스턴스 메서드는 인스턴스를 생성하고 나서 reference 변수를 이용해 사용할 수 있다.
- 클래스 메서드는 클래스명.메서드명()으로 사용이 가능하다.
- 메서드 안에 선언된 변수들은 메서드가 실행될 때마다 메모리에 생성되었다가 메서드가 종료될 때 사라진다. (지역 변수)
인용
https://www.programmersought.com/article/4905216600/
https://stuefe.de/posts/metaspace/what-is-metaspace/
728x90
'Language > Java' 카테고리의 다른 글
Package (0) | 2023.09.13 |
---|---|
좋은 객체? 나쁜 객체? (0) | 2023.09.13 |
클래스 메서드에서 인스턴스를 필드를 사용하지 못하는 이유 (0) | 2023.09.13 |
클래스 필드(static field)에 대한 고찰 (0) | 2023.09.13 |
CLASS METHOD vs INSTANCE METHOD (0) | 2023.09.13 |