1) 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
2) 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
3) Class Loader를 통해 class파일들을 JVM으로 로딩한다.
4) 로딩된 class파일들은 Execution engine을 통해 해석된다.
인터프리티드 언어는 특별한 플랫폼 의존성을 가질 필요가 없다. 실행중에 ‘interpreted’ 되므로, 적절한 interpreter만 있다면 어떤 기종에서도 잘 실행될 수 있는 것이다. 이런 이유로 인터프리티드 언어는 보다 더 크로스플랫폼적 성격을 갖게 된다.
요런 게 byte code.
모든 Thread에 공유되는 영역: method area, heap
Method Area
Heap
PC 레지스터
Native Method
* [JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간](https://stackoverflow.com/questions/18900736/what-are-native-methods-in-java-and-where-should-they-be-used)
JIT 컴파일러가 만든 네이티브 코드도 여기에 들어가는 건가?
public class Controller {
private QuestionDao questionDao = QuestionDao.getInstance();
// dao : 상태없으니까 갠츈
// private Question question; // 1) 싱글 instance 안에 있는 필드 변수 : 멀티쓰레드 환경에서 동시접근하며 문제 발생 가능
public void doSomething() {
Question question;
// 2) 여기는 stack 영역이기 때문에 1)과 달리 멀티쓰레드 환경에서 동시접근 문제 X
}
GC에서 사용하는 알고리즘
Reachable, Unreachable 식별하는 것
Reachable: 사용중, Unreachable: 사용중이지 않은
Reachable ↔ Unreachable : Rootset과 관계 있으면 reachable
Rootset: 프로그램에서 직접적으로 도달가능한 객체의 집합
1. stack 영역 데이터
2. static
3. JNI
여기서 빨간 색은 unreachable한 것이다.
Unreachable한 객체를 heap에서 제거한다.
메모리 최적화
메모리 최적화란? 사용 가능한 메모리가 존재하지만 할당 불가능한 문제 해결
Young Generation에 대한 GC
Old Generation에 대한 GC
Old Generation이 다 차면 Mark and Sweep, (Compact)를 한다.
GC를 실행할 때 JVM이 애플리케이션 실행을 멈추는 것
: GC를 실행하는 쓰레드 외에 모든 쓰레드가 작업을 중단한다.
싱글스레드로 GC 처리한다.
Young Generation 영역을 멀티쓰레드로 GC 처리한다.
Old Generation도 멀티쓰레드로 GC 처리한다.
compact하지 않는다.
stop the world를 줄이기 위해 고안
엘리 테코톡을 보고 정리한 자료입니당~