JVM(Java Virtual Machine)?
자바 가상머신으로 JAVA가 OS에 구애받지 않고 실행되도록 OS 위에 가상 머신을 띄우고 그 가상머신에 JAVA 프로그램이 실행되도록 한다. JVM에서는 GC(Garbage Collection), 메모리 관리
등의 역할을 한다. 그렇기 때문에 JAVA는 OS가 변경되더라도 코드 변경없이 해당 OS에 맞는 JVM만 설치하면 애플리케이션을 사용할 수 있다.
JAVA는 JVM에서 실행되기 위해 JAVA 컴파일러(JAVAC)를 통해 .class 파일로 컴파일 되고, JVM은 이렇게 생성된 .class 파일을 읽어 프로그램을 실행한다. (Byte code) 일반적으로 기계어가 아닌 Byte code를 JVM을 통해 해석(Interpret)하여 기계어로 변환 후 실행되기 때문에 속도가 느리다는 단점을 가지고 있으나 JAVA 진영의 최적화가 점점 발전하면서 격차가 많이 줄었다.
- JIT 컴파일러 : 바이트코드→기계어로 변환 (인터프리터의 느린 속도를 보완)
자바는 동적로딩(Dynamic Loading)을 지원하기 때문에 필요한 시점에 클래스를 로딩하여 사용할 수 있다.
JVM 메모리 구조
JVM의 메모리는 아래와 같이 구분할 수 있다.
- 메서드 영역(Method area), Class Area
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수도 이 영역에 함께 생성된다.
- 힙(Heap)
- 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수(instance variable)들이 생성되는 공간이다.
- 호출 스택(Call stack 또는 Execution stack)
- 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간을 반환되어 비워진다.
클래스 메서드(Static method)와 인스턴스 메서드
- method 앞에 static이 있는 경우 클래스 메서드, 그렇지 않으면 인스턴스 메서드
- Class method : 인스턴스를 생성하지 않고 className.methodName()으로 사용 가능
- 보통 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 method는 static method로 정의함
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것은 static으로 생성하여 클래스 변수로 만듬
- 클래스 변수(static 변수)는 인스턴스 변수를 사용할 수 없음 → 클래스 메서드에서 인스턴스 변수를 사용할 수 없는 이유
- method 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는것을 고려해야 한다. (인스턴스 생성을 안하기 때문에 성능 향상 됨)