1. JVM
jvm : 자바 가상 머신 (java virtual machine)
진짜 컴퓨터 안에 자바언어가 돌아가는 가상의 컴퓨터를 말한다.
2. 자바 코드는 ~.java 파일로
써진다.
~.class(byte code)로 컴파
일(번역)을 한다.
이 byte code 는 jvm 에
input 된다.
jvm 은 코드를 읽고 해석
해서 프로그램을 실행한다.
3. 이때 JVM 은 코드를 운영체제에 맞게 실행한다.
window면 window 에 맞게,
맥이면 맥에 맞게,
리눅스면 리눅스에 맞게,
알아서 실행해주니까
믿고 쓰면 된다.
4. JVM 내부 구조
The Stack
메서드 안에서 사용되어지는 값들 저장, 호출
된 메서드의 매개변수, 지역변수, 리턴 값 및
연산 시 일어나는 값들을 임시로 저장
stack 안에는 stack frame 이 쌓이는데
stack manipulation을 돕는 세명의 레지스터
가 있다.
vars, frame, optop 이다.
vars -> 로컬변수를
frame -> execution environment을
optop -> method area fmf
5. JVM 내부 구조
garbage-collected heap
자바프로그램의 객체들이 저장된다.
우리가 직접 alloc(동적할당) 하지 않고 자동으로 관리한다.
힙 영역의 메모리공간이 부족하게 되면 자동으로 가비지컬렉션이
수행된다.
힙 영역 공간이 너무 크다면 그간 쌓여있던 모든 old 객체들을 지운다.
6. JVM 내부 구조
Method Area
바이트 코드들을 담고 있는 영역이다.
program counter 가 method area 안에 바이트들을
가리키고 있다.
또한 클래스의 전역변수인 클래스 변수(static) 위치
JVM에서 실행되고 있는 모든 스레드에 의해 공유
7. 아래의 소스를 이해하고 JVM의 메모리 모델을 그려보세요
(메소그 영역, 스택, 힙)
class Point {
int x, y;
void move(int x, int y) {
this.x = x;
this.y = y;
}
int getX() { return(x); }
int getY() { return(y); }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void draw() {
System.out.println( "Point(" + x + "," + y + ")");
}
}
class PointTest {
public static void main(String[] args) {
Point p1, p2 = null;
p1 = new Point();
p1.move(4, 4);
p2 = new Point();
p2.move(2, -4);
}
}
8. 아래의 소스를 이해하고 JVM의 메모리 모델을 그려보세요
(메소그 영역, 스택, 힙)
class Point {
int x, y;
void move(int x, int y) {
this.x = x;
this.y = y;
}
int getX() { return(x); }
int getY() { return(y); }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void draw() {
System.out.println( "Point(" + x + "," + y + ")");
}
}
class PointTest {
public static void main(String[] args) {
Point p1, p2 = null;
p1 = new Point();
p1.move(4, 4);
p2 = new Point();
p2.move(2, -4);
}
}
1. JVM은 PointTest 클래스를 메소드 영역
에 main의 바이트코드 로드하고 main을 실
행
2. main실행시 들어오는 인자 args를 main
의 스택에 저장하고 null로 초기화 한다.
3. p1. p2를 스택에 저장하고 p1은 빈값, p2
는 null로 초기화 한다.
4. p1 = new Point() 에 의해 Point 객체를
힙에 생성하고 어드레스를 p1 에서 보관
(스택변수 p1이 메모리 힙의 Point 객체를
참조한다)
5. 메모리힙에 있는 p1이 참조하고 있는
Point객체의 x, y를 4, 4 로 셋팅
move 메소드가 실행되는 동안 move의
스택영역에 로컬변수 x, y,를 할당하고 4을
대입 후
인스턴스 변수 x, y에 대입 (this.x = x,
this.y=y)
move 메소드가 끝나면 로컬변수 x, y를
스택에서 해제
6. 이하 동일
9. Garbage Collection
객체는 살아있는 Thread나 static 참조를 통해 도달할 수 없게 된다면 GC 대
상이 된다. 다시말해 모든 객체의 참조가 모두 null 일 경우에 GC 대상이 된다.
11. 힙은 Young, Tenured(=Old), Permanent(=Perm Area)
Generation의 세 영역으로 나뉜다. 또 Young Generation은
Eden, Survivor1, Survivor2 영역으로 나뉜다. 객체는 처음 생성
될 때 Young Generation의 Eden 영역에 생성된다. Minor GC 이
후 객체가 살아있다면 Survivor1로 옮겨진다. Major GC 전에
Survivor2의 객체는 Tenured Generation으로 옮겨진다.
Permanent Generation은 클래스나 메소드 등의 메타데이터를
저장하거나 String Pool의 공간으로 사용되어지는 조금 특별한
공간이다.
Garbage Collection