본문 바로가기

JAVA/JAVA 객체지향

[Java] 자바 가상 머신 - JVM(Java Virtual Machine)

JVM이란? 자바를 실행하기 위한 가상의 컴퓨터

어느 운영체제상에서도 실행할 수 있도록 한다.

일반 프로그램과 다른 JAVA의 실행 방식

운영체제 입장에서 자바 가상 머신

  • 운영체제의 관점에서는 자바 가상 머신도 하나의 프로그램이다.
  • 운영체제가 일반 프로그램에게 4GB 메모리 공간을 할당해준다면 JVM에게도 4GB 메모리 공간을 할당해준다.
  • 자바 프로그램이 실행되면, 가상 머신도 개가 실행이 된다.

자바 가상머신의 메모리 모델

메서드 영역(Method Area)

  • 자바 바이트 코드(클래스에 대한 정보)
  • static 변수(클래스 변수)가 저장되는 영역

자바 바이트 코드(Java byte code)

자바 바이트 코드(Java byte code)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.

자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다.

이러한 자바 바이트 코드의 확장자는. class이다.

자바 바이트 코드는 자바 가상 머신만 설치되어 있다면, 어떤 운영체제에서라도 실행될 수 있다.

 

바이트 코드(.class 파일)가 올라가는 영역이 메서드 영역이다. (바이트 코드가 올라가는 것을 '클래스 로딩'이라 한다.)

메서드와 static 변수는 한번 메모리 공간에 할당이 되면 프로그램이 종료될 때까지 유지된다.

스택 영역(Stack Area) - 임시저장

  • 메서드, 지역변수, 매개변수가 스택 영역에 저장된다.
  • 메서드의 사용이 완료되면 스택에서 제거된다.

영역(Heap Area) - 인스턴스 저장 영역

  • 인스턴스가 힙 영역에 저장된다.

 

1
2
3
4
5
6
        public static void simpleMethod(){
            String str1 = new String("My String");
            String str2 = new String("Your String");
            ...
        }
 

인스턴스는 스택에 저장하면 안될까?

"My String"의 데이터가 스택 영역에 데이터처럼 사용하고 나면 삭제된다고 가정해보자

str1 참조변수는 "My String"의 저장 공간의 주소를 참조하고 있다.

그러면서 str2 참조변수에 str1이 참조하고 있는 주소 값을 저장시켰다.

String str2 = str1;

str1 참조변수가 다 사용되고 나면 str1과 "My String" 데이터는 없어질 것이다. (다 사용 되었기 때문에)

이럴 경우 str2 참조변수는 참조하고 있는 "My String"을 사용할 수 없게 되어 버린다.

 

 

 

 

 

  • 인스턴스는 이상의 영역에서 이상의 참조변수를 통해서 참조가 가능하다.
  • 하나의 참조변수가 사라진다고 해서 참조변수가 참조하고 있는 인스턴스를 삭제할 경우 다른 참조변수는 참조할 없게 된다.
  • 그러므로  영역에 인스턴스는 자기 자신을 참조하고 있는 참조변수가 있는지 없는지 확인해야 한다.
  • 참조하는 변수가 없다면 영역에 인스턴스는 지워도 되는데, 지우는 것을 JVM(가비지 컬렉터) 대신 해준다.
  • 여기서 지우는 행위(메모리 정리)를 가비지 컬렉션이라고 한다.

 

자바 가상머신의 인스턴스 소멸 시기

1
2
3
4
5
6
7
public static void simpleMethod(){
    String str1 = new String("My String");
    String str2 = new String("Your String");
    ...
    str1 = null;
    str2 = null;
}
 

str1참조변수와 str2참조변수에 null 주었을 경우 참조 관계가 끊어진다.(접근이 불가능)

따라서 접근이 불가한 인스턴스는 가비지 컬렉션의 대상이 된다.

가비지 컬렉터는 참조하고 있는 변수가 없기 때문에 메모리에서 제거한다.

 


윤성우의 열혈 JAVA - https://cafe.naver.com/cstudyjava?iframe_url=/MyCafeIntro.nhn%3Fclubid=19799898