- JVM은 Java ByteCode를 실행 할 수 있는 주체. (.class 파일을 실행 의미.)
- JAVA는 플랫폼에 독립적. OS마다 JVM이 의존적이며 OS에 맞는 JVM이 JAVA bytecode를 OS에 맞게 해석해주는 역할을 함.
1) Class Loader : jar파일 내에 있는 Class들을 JVM위에 Load하고 사용할 수 있도록 한다.
2) Runtime Data Area (실행시간 데이터 영역) : Load된 클래스가 사용하는 메모리를 영역 별로 나누어 관리.
l 모든 thread에서 공유 : Method Area, Heap
=> Method Area는 Class와 Interface에 대한 상수, method, Static 변수 등을 보관하는 영역으로 JVM 시작 시 생성되어 프로그램 종료나 null 선언 시 까지 사용됨.
=> Heap Area는 프로그램에서 데이터를 저장하기 위해 Runtime 시 동적으로 할당하여 사용하는 영역. 생성되는 객체들이 저장되는 곳.
객체가 더 이상 쓰이지 않아 GC 대상이 되어 사라지거나 null 선언 시 까지 사용됨.
l 각 thread에서 공유 : Stack Area, PC 레지스터, Native Method Stacks
3) Execution Engine: Class Loader를 통해 JVM내의 Runtime data Area에 배치된 바이트 코드는 실행엔진에 의해 실행됨. Java bytecode를 명령어 단위로 읽어서 실행.
1.1 SUN Java의 Heap 구조
1) JDK 1.8 이전 버전
2) JDK 1.8 이후 버전
- JDK 1.8 부터 Permanent Generation이 MetaSpace로 대체가 되었음.
- 기존 Heap메모리에 위치해 있던 Meta 정보들이 Native 메모리에 저장되어 메모리가 부족할 경우 자동으로 늘려줍니다.
- 기존 PermGen 사용으로 인해 발생하던 아래와 같은 Error를 더 이상 나타나지 않게 됩니다.
OutOfMemoryError: PermGen Space error
- MetaSpace의 장점
1) PermGen 영역이 사라져 Heap 영역에서 사용할 수 있는 메모리 공간이 늘어났음.
2) PermGen 영역을 관리하던 복잡한 코드들이 삭제되고 PermGen 영역을 관리하기 위해 소모되던 시간이 감소하여 GC 성능이 향상 됨.
- Heap Size관련 JVM 옵션
-Xms2048m -Xmx2048m => Heap SIZE 설정
-XX:SurvivorRatio=<value> => 값이 n이면 n:1:1(Eden:Survivor1:Survivor2)로 설정
-XX:NewRatio=<value> => 값이 n이면 Young:Old 비율이 1:n (Default = 2)
-XX:NewSize=<size> => New 영역의 크기를 명시적으로 할당 (Default : not limited)
1.2 IBM Java의 Heap 구조
1) JDK 1.5 이전 버전
2) JDK 1.5 이후 버전
- Heap Size관련 JVM 옵션 (-Xgcpolicy:gencon 일 때)
-Xmns, -Xmnx => Nursery (SUN의 New) 영역의 최소, 최대 크기
-Xmos, -Xmox => Tenured (SUN의 Old) 영역의 최소, 최대 크기
기본값으로 Nursery와 Tenured의 비율은 1:3
[빅데이터]_ETL Tool Pentaho Data Integration (0) | 2023.07.04 |
---|---|
[Infra] WEB-WAS-DB 3tier Infra Architecture (0) | 2023.06.01 |
[JVM] OutOfMemory dump 생성 JVM옵션 및 ThreadDump 생성 옵션 (0) | 2023.06.01 |
[JVM] HeapDump 분석 (0) | 2023.06.01 |
[JVM] Garbage Collector 동작방식 (0) | 2023.06.01 |