자바가 아닌 C나 C++등으로 작성한 코드를 컴파일하면, 각기 다른 운영체제에서 실행할 수 있는 어셈블리어로 번역된 결과물을 얻을 수 있다. 즉, 컴파일 과정이 운영체제에 종속적이다, 그러나 자바에서는 컴파일 과정이나 컴파일 결과물이 아닌, 이러한 결과물을 실행하는 JVM(Java Virtual Machine)이 운영체제에 종속적이다.
자바 언어로 프로그램 코드를 작성한 뒤 (java
파일), JAVAC 컴파일러를 이용해 컴파일하면 바이트 코드 파일(class 파일)을 생성할 수 있다. 맥이든 윈도우든 class
파일만 있다면 각기 다른 운영체제의 JVM이 이를 기계어로 번역해 실행시켜준다. 따라서 프로그래머가 프로그램을 실행하는 운영체제를 신경 쓰지 않고 프로그래밍할수 있다는 장점이 있다.
JVM이 시작되면 운영체제로부터 메모리 영역을 할당받는데, 아래와 같이 5개의 영역으로 나눌 수 있다.
static
변수에 관한 정보도 메소드 영역에 저장된다. new
연산자를 통해 객체 또는 배열을 생성하면 이 영역에 저장된다. JVM 스택 영역의 변수나 다른 객체의 필드에서 객체를 참조한다면, 바로 이 Heap 영역에 존재하는 객체를 참조하는 것이다.malloc
과 free
, C++에서는 new
와 delete
를 이용해 객체를 동적 할당하고 필요 없는 객체는 동적 할당을 해제한다. 그러나 Java에서는 프로그래머가 직접 메모리 영역에 손을 댈 수 없기 때문에 할당을 해제할 수 없다. 대신 JVM의 Garbage Collector가 자동으로 필요 없는 객체를 메모리에서 대신 제거해 준다. 참조되지 않는 객체를 쓰레기로 간주하고 힙 영역에서 제거한다.char
, int
형 등등). 반면에 참조 타입 변수는 힙 영역에 존재하는 객체의 주소값을 이용해 객체를 참조한다(String
, Integer
등등).