


Person.java 파일을 작성한 후 javac 명령어를 통해 컴파일하면 Person.class와 같이 .class 파일이 생성된다. 이 .class 파일은 java 코드를 바이트 코드로 변환한 파일이다. Class Loader는 이렇게 생성된 class 파일들을 엮어 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area에 적재하는 역할을 한다.
Class Loader에 의해 메모리에 적재된 바이트 코드들을 기계어로 변경하여 실행하는 역할을 한다. Interpreter 방식과 JIT(Just-In-Time) 컴파일러를 이용하는 방식이 있다. Interpreter 방식은 명령어 단위로 바이트 코드를 읽어 실행한다. Interpreter 방식이 한 줄씩 수행하기 때문에 느리다는 단점이 있어 이 단점을 보완하기 위해 JIT 컴파일러 방식이 도입되었다. JIT 컴파일러 방식은 자주 실행되는 바이트 코드들에 대해 전체를 컴파일 하여 네이티브 코드로 변경하는 방식이다. 네이티브 코드는 캐시에 보관되기 때문에 한 번 컴파일된 코드는 빠르게 수행이 가능하기 때문이다. 하지만 한 줄씩 컴파일하는 Interpreter 방식에 비해 바이트 코드 전체를 컴파일하는 JIT 방식의 속도가 훨씬 느린 탓에 Interpreter 방식과 JIT 방식을 혼용하는 것이 가장 효율적이다.
Heap 메모리 영역에 생성된 객체들 중 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다. GC가 수행되는 동안은 GC를 수행하는 쓰레드 외의 모든 쓰레드는 일시정지된다. 특히 Full GC가 발생하면 수 초간 모든 쓰레드가 정지하게 되어 장애로 이어지는 문제가 발생할 수 있다.
자바의 모든 코드는 클래스 내부에 존재해야 한다.
자바는 실행전에 static 멤버를 모두 static 메모리 공간에 로드한다.
자바프로그램을 실행(컴파일된 자바파일 → 클래스파일 .class)하면 main 메소드를 실행하고
main 메소드가 끝나면 종료된다
public class Ex01 {
private static int n2 = 20;
public static void main(String[] args) {
int n1 = 10;
TestClass testClass = new TestClass(); // Heap공간에 메모리가 동적으로 할당됨
int n3 = testClass.getNum(); // TestClass의 메소드 실행결과가 stack공간의 n3에 자장
System.out.println(n1); // main이라는 stack 공간의 n1
System.out.println(n2); // Ex01이라는 클래스의 static 공간의 n2
System.out.println(n3); // main이라는 stack 공간의 n3
}
}
class TestClass {
private int n3 = 30;
public int getNum() {
return this.n3;
}
}
Class 자료형
// new 가 되어서 힙에 할당이 될 때 사이즈를 알 수 있다.( 프로그램이 실행 되었을 때 = Runtime )
class MyData {
int id = 1;
int price = 1000;
}
public class Ex02 {
public static void main(String[] args) {
// int num; -> 변수를 선언한다.
// int num = 10 -> 변수를 초기화(메모리에 할당)힌다.
int num = 10; // 일반변수( 크기가 정해져 있는것 = 컴파일 시점 )
MyData d = new MyData(); // 레퍼런스변수( 크기가 정해져 있지 않는 것 = 런타임 시점 )
System.out.println(num);
System.out.println(d.id);
System.out.println(d.price);
}
}