일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Metaspace
- 주문
- 리팩터링
- B+TREE
- JPA
- JDK14
- 제네릭
- 상태패턴
- JAVA8
- lazyloading
- 공변
- Jenkins
- 트랜잭션
- GithubActions
- springboot
- 카카오 화재
- 부하테스트
- CaffeineCache
- backend
- method area
- 재고 시스템
- Ehcache
- Redis
- 웹캐시
- 지연로딩
- nonclustered index
- ci/cd
- Spring Data Redis
- 동시성
- java
- Today
- Total
NDM
[Java] Java8 MetaSpace 본문
https://ndm-tech.tistory.com/3
에서 Java Runtime Area에 대해 정리했습니다
다만, GC를 알아보기에 앞서 정확히 Java8 이전과 이후를 볼 때, MetaSpace 영역이 추가됨으로써
한눈에 정리되지 않는 느낌이 들어 다시한번 정리하고자 합니다
자세한건 위 포스팅을 참고해주시고, 이번 포스팅에서는 GC를 알아보는게 목적이므로
Java8을 기준으로 어떻게 바뀌었는지에 대해서만 간략하게 알아보고 넘어가겠습니다
Java 8 Metaspace
Java8 에서는 MetaSpace라는 영역이 추가되었습니다.
엄밀히 말하면 추가되었다기 보다는, Java8 이전에 Method Area라는 영역이 있었죠
여기서 Method Area는
- 클래스, 인터페이스, 객체 구조, 메소드 등등 의 메타데이터
- Runtime 상수 풀
- Static 관련 정보
들을 관리하는 공간이었죠. 여기서 하나만 더 들어가보겠습니다 Permanent Generation이라는 영역입니다
Permanent Generation(Permgen)을 Method Area 동등하게 보는 글들이 많지만, 이는 사실이 아닙니다
Permanent Generation이라는 영역의 하위 집합에 Method Area가 들어있는 것이죠
저 Permanent Generation 공간 안에 Method Area가 위치하고, Heap에 속하지 않기 때문에
Static 관련 데이터가 늘어날 수록 OOM의 위험도도 증가했습니다. Permsize옵션을 통해 따로 늘려줘야 해요.
여기까지는 Jdk 1.7 까지의 구조입니다. Java8에서 MetaSpace가 도입되고 어떻게 변했을까요??
Permanent Generation 공간이 사라지고, MetaSpace라는 영역이 추가되었습니다. 자세히 볼게요
MetaSpace는 Non-heap 영역에 할당이 되어 있습니다. 즉, JVM이 아닌 OS로부터 영역을 자동으로 할당받습니다.
그럼 Method Area는 어디로 갔을까요??
Java8 부터는 MethodArea를 MetaSpace가 완전히 대체한다는 내용이며,
Method Area에서 관리하던 데이터 중
Class의 메타데이터는 Native Area로, static 변수, 메소드, 레퍼런스들은 Heap 영역으로 할당된다는 내용이죠.
즉, 정리하면
- Java8 이전에는 클래스 메타데이터와 Static관련 데이터, 런타임 상수 풀을 Method Area라는 Permanent Generation의 하위 집합에서 관리
- Java8 이후 Native Area에 MetaSpace라는 공간이 추가되었고, Permanent Generation이 MetaSpace로 대체되며 클래스 메타데이터는 Native Area인 MetaSpace에서, Static 데이터는 Heap 영역에서 관리(Rerence는 MetaSpace에서 관리)
결과
Java8을 기준으로 이전과 이후의 Runtime Data Area에 대해 살펴보았습니다.
그럼 이러한 변화는 어떤걸 의미하는 걸까요?
- JVM에서 관리하던 Permanent Generation을 OS가 자동으로 관리하도록 바뀌며, 직접적으로 할당할 필요가 없이 계속해서 늘어나 개발자는 이 부분에 대해 고민할 필요가 없어졌습니다
- Static데이터가 Heap에 들어감에 따라, Static도 GC의 대상이 될 수 있습니다
- 이전에는 Permanent Generation 영역에서 메모리 부족으로 인해 OOM이 발생하는 상황이 많았다고 합니다. 이제부터는 Xmx(Heap메모리최대치옵션) + MaxMetaSpace + NIO를 통해 Native Memory를 직접 할당받는 크기까지 고려해서 메모리를 할당해야 OOM에서 최대한 벗어날 수 있을 것입니다.
참조
https://m.post.naver.com/viewer/postView.nhn?volumeNo=24042502&memberNo=36733075
https://jgrammer.tistory.com/144
https://goodgid.github.io/Java-8-JVM-Metaspace/ https://www.samsungsds.com/kr/insights/1232761_4627.html
https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/
'Java' 카테고리의 다른 글
[Java] 자바 동작 원리와 JVM 3편 : Garbage Collector (0) | 2022.08.08 |
---|---|
[Java] Java Exception과 Spring Transaction (0) | 2022.08.06 |
[Java] Java Generic은 어떻게 동작할까? (0) | 2022.05.09 |
[Java] GC와 Java Reference Type 1편 : Java Reference Type (0) | 2022.05.01 |
[Java] 자바 동작 원리와 JVM 2편 : Runtime Data Area (0) | 2022.04.28 |