간편정리
- 자바 소스코드 작성 : 개발자가 작성하는 자바소스코드 => .java 의 형태로 저장됨
- 컴파일 : 이 .java 파일을 자바컴파일러가 ByteCode로 바꿈 (.class)
- 클래스 로딩 : Class Loader가 이 .class 파일을 Runtime Data Area에 Loading 시킴
- 실행 : Runtime Data Area에 Loading된 .class파일이 Execution Engine에 의해 interpreter, JIT 방식을 통해 해석됨
- 런타임 데이터 영역에서의 처리 : 해석된 내용은 Runtime Data Area에서 스레드 동기화, 가비지 컬렉션을 수행함
JVM 메모리영역의 구조
- Primitive Type (boolean, byte, short, int, log, char, float, double) 을 제외한 나머지 타입은 Refrence Type (class, interface, enum, Array) 이라고 함
구조 **Method Area** **Heap** **Stack** **PC Register** **Native Method Stack** JVM이 시작될 때 생성되는 공간으로 바이트코드가 이 영역에 저장됨 동적으로 생성된 객채가 저장되는 영역, GC의 대상이 되는 공간 지역변수, 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역 스레드가 시작될 때 생성되며, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간 (스레드가 어떤 부분을 어떤 명령어로 수행할지를 저장하는 공간) JAVA가 아닌 즉 C/C++ 등의 코드를 수행하기 위한 공간 클래스 정보, 변수 정보, static으로 선언한 변수 저장 new 연산을 통하여 동적으로 생성된 인스턴스 변수 저장 지역,매개변수의 특성상 해당 메서드의 호출이 종료되면 선언된 변수들이 사라지게되기에 주로 금방 사용되고 끝나는 데이터가 저장됨 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역 모든 스레드가 공유 모든 스레드가 공유 스레드 마다 하나씩 생성되는 공간 스레드 마다 하나씩 생성되는 공간 스레드 마다 하나씩 생성되는 공간
Reference Type의 변수들이 실행될때마다 스택에 쌓여서 넣었다 뺐다하면 비효율적이므로 Heap영역에 진짜 메모리를 저장하고, 그 메모리의 주소를 참조하는 변수를 stack영역에 저장함
Car a = new Car("Porsche", "blue" ...);
a -> Stack, Car(..) -> Heap
따로 정리할 예정 !