JDK
JDK | |||||||
JRE | + javac, jar, debugging tools, javap | ||||||
JVM | + java, javaw, lib, rt.jar | ||||||
Class Loader |
Execution Engine |
Runtime Data Area |
|||||
Interpreter | JIT Compiler | Garbage Collector |
Java Source(.java)
-(javac,자바컴파일러)-> Java Byte Code(.class)
-(ClassLoader, JVM 동적으로 클래스로딩)-> JVM 이동
1. (Interpreter)-> 바이트코드 읽고 요청내용 실행
2. (JIT Compiler)-> 기계어 변환후 실행
JVM
= ClassLoader + Execution Engine(Interpreter+JIT Compiler+GC) + Runtime Data Area
Runtime Data Area (JVM Memory) | |||||||||||||
JVM Language Stack |
Heap Space |
Method Area |
Native Method Stack |
PC Register | |||||||||
Young Generation |
Old Generation |
Permanent Generation -> Metaspace(JDK1.8) |
Code Cashe |
||||||||||
Eden |
To Survivor | Virtual |
Old |
Virtual |
Runtime Constant Pool |
Virtual | Thread 1~N |
Compile | Native | Virtual | |||
From Survivor | Field & Method Data |
||||||||||||
Code |
1. JVM Language Stack
: Last In First Out :LIFO , 메서드 호출 시마다 스택프레임 생성 수행후 삭제 , 메서드 안에서 사용되어지는 값(매개변수, 지역변수, 리턴값, 연산시 일어나는임시값)
2. Heap Space
-Xms 최소 Heap 공간(Eden +Survivor+Old)
-Xmx 최대 Heap 공간(Eden +Survivor+Old + Virtual)
+ Xms, Xmx 동일하게 셋팅 메모리 추가할당 시 WAS ms 정도 멈춤현상 주의
Young Generation : Minor GC 발생
Eden : 새로 생성된 대부분의 객체가 처음 위치하는 영역, GC 발생후 살아남은 객체는 Survivor1 or Survivor2이동
Survivor1, Survivor2 : 둘중 하나의 영역이 꽉차면 참조없는 객체삭제, 살아남은 객체가 비워진 다른 Suvivor 영역이동
-XX:NewSize 최소 Young 공간 (Eden + Survivor)
-XX:MaxNewSize 최대 Young 공간 (Eden + Survivor + Virtual)
-XX:SurvivorRatio Eden(new)/Survivor 영역 비율
-XX:NewRatio Young(Eden + Survivor)/Old
Old Generation : Major GC(Full GC) 발생
Old : Survivor에서 살아남은 객체만이 Old 영역이동, Old영역은 Young영역보다 크게 할당
3. Method Area = Class Area = Code Area = Static Area
Permanent : Runtime Constant Pool + Field & Method Data + Code
클래스, 인터페이스에 대한 런타임상수, 멤버변수(필드), 클래스변수(**Static), 생성자 메서드 저장
*Java8에서 Metaspace 영역으로 교체 OutOfMemoryError 이슈
-XX:PermSize 초기 Perm size
-XX:MaxPermSize 최대 Perm size
+ 1.8 에서는 무시 Metaspace 대체 힙 메모리 일부
-XX:MaxMetaspaceSize
4. Native Area
Code Cashe : JIT방식: Just In Time : Java -> ByteCode-> 기계어
변환 시간 절약위해 많이 쓰는 코드 기계어로 변환시켜 저장해둠
5. PC Register
현재 수행중인 JVM 명령과 주소 저장, CPU내의 기억장치, Thread가 생성될 떄 마다 생성
(이부분은 정확하지 않음 팁 소스에 따라 다르니.. 긇어모음)
최대 할당메모리 Xmx + MaxPermSize
Full GC 시간을 줄이는게 중요, 큰 요구사항없다면 Heap Size 1G
ex)
-Xmx1024m –Xms1024m -XX:MaxNewSize=384m -XX:MaxPermSize=128m
>>전체 1024+138+300~500 : 1.5G
New : Old 비율은 서버 어플리케이션 1:2 적당 >> MaxNewSize = Xmx / 3
Perm 128M 적당, 256M을 대부분 넘지 않음
출처
tcpschool.com/java/java_intro_programming >> 자바프로그램 실행과정
epthffh.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A0%A8-%EC%84%A4%EC%A0%95 >> 메모리 설정팁
javaslave.tistory.com/23>> java 옵션
johngrib.github.io/wiki/java8-why-permgen-removed/ >>1.7 vs 1.8
mirinae312.github.io/develop/2018/06/04/jvm_memory.html >>JVM Heap 메모리구조 간단히 보기
'For Real > Java & Spring' 카테고리의 다른 글
Gradle (0) | 2019.07.17 |
---|---|
1. 자바 기본용어- 자바 플랫폼 (0) | 2019.06.09 |
[스프링부트 개념과 활용 by 백기선] 2부 스프링 부트 시작하기. (0) | 2019.05.22 |
BigDecimal (0) | 2019.05.17 |
스프링 부트 jsp js 바로 수정가능 (0) | 2019.03.19 |