JVM 

 

  JVM(Java Virtual Machine) 자바 가상 머신 이라 불리며 컴파일된 바이트코드 파일을  읽어 실행 시키는 역할을 한다.

  

우선 대략적인 자바 실행 과정을 설명하면 사용자가 1.텍스트형태에 자바코드를 만들면 (.java)  2.컴파일러에 의해서 바이트코드로 컴파일 되고(.class) 3.이는 각각의 os에 맞는 JVM(자바 가상 머신)이 메모리를 할당 받고 실행 가능하도록 기계어로 해석하여 준다.

  JVM 부분을 조금더 자세히 설명하면 Runtime Data Area(JVM 메모리 영역)에 메모리가 할당되면 Class Loader가 Byte Code(.class)파일을 그곳에 로드하고 배치한다. 그리고 Execution Engine가 그것을 해석하고 실행시킨다.


 메모리는 한정되어 있으며 메모리의 효율적인 관리는 프로그램에 성능을 좌우하기 때문에 메모리 구조를 정확히 이해하고 메모리 관리를 하는 것이 필요하다.



JVM 메모리 구조


Runtime Data Area영역은 크게 3가지로 나뉘어 진다. 


1. 메소드 영역 (Method Area) 

같은 뜻으로 Class Area, Code Area, Static Area가 있다.

 여기에는 런타임 상수풀, 멤버 변수, 클래스 변수, 생성자와 메소드와 같이 클래스와 인터페이스에 관련된 데이터를 분류하고 저장한다.

JVM 시작시 생성 되며 프로그램 종료시까지 유지된다. 그러므로 멤버 변수는 어디에서든 사용이 가능하다. 


2. 힙 영역 (Heap Area)

 실행시 동적으로 할당하여 사용하는 영역이다. New 연산자로 생성된 객체나 배열을 저장한다. 여기에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조하는 변수,필드가 없으면 Garbage Collector에 의해 메모리 반환된다.


3. 스택 영역(Stack Area) 혹은 call stack

 메소드 호출 시 생성되어지는 영역이다. 지역변수, 매개변수, 연산중 나오는 임시데이터 등이 저장된다. 메소드가 종료되면 해당 영역은 비워진다. 기본 타입 변수는 스택 영역에 직접 값을 가지며 참조 타입 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다. 

 

각 메소드당 메모리상의 공간은 구별되며 처음 호출된 메소드의 공간이 마련되고 그 메소드 수행 중에 다른 메소드가  호출되면 첫번째 메소드 수행을 멈추고 그위에 두번째 메소드를 위한 공간이 마련되고 두번째 메소드를 우선 수행한다. 수행을 마치게 되면 그 메소드를 위한 공간이 비워지고 아까 수행중이던 메소드를 다시 수행한다. 




예를 들어 보면은~




//1 번 까지의 상황이다 



args[]에 값 두개를 넣었다 10,20 

args 라는 자체는 스택영역에 있지만 참조 되어지는 배열은 힙영역에 들어간다.


//2 번 까지의 상황이다


 add메소드는 이미 수행이 끝나고 multi메소드가 수행된 상태이다.

 

 total 변수는 클래스 변수로 메소드 영역에 있어 어느 메소드에서나 접근이 가능하다 add()와 muiti() 메소드들의 ++total 을 수행하여 2가 되었다.

 add()의 수행값을 sum에 넣어 sum값이 30 multi()의 수행값을 multi에 넣어 multi값이 200이 되었다.

 multi메소드가 수행할때에는 매개변수 a,b에 메인 메소드의 지역변수 x,y 값이 대입되어 각각 10 20 값을 가졌다. 이는 종료후 사라질 것 이다.



번외)

이클립스에서 인자값 주는법


위 사진처럼 Program arguments 칸에 넣으면 된다.


추가적인 내용으로 위에 사진에 보이는 VM arguments 칸은 사용자가 직접 JVM메모리의 용량을 설정해 주는 것이다.

-Xmx<size> 초기의 Heap size   -Xms<size> 최고 Heap size    -Xss<size> Stack size   

 설정값의 종류이다. 힙사이즈는 초기값과 최고값이 정해져있다. 동적으로 크기가 변함을 알 수 있다. 하지만 최초 크기와 최대 크기를 동일하게 부여할 것을 권장한다. 크기의 동적인 변경에 의한 오버 헤들를 최소화하기 위해서이다

 -Xms1024m-Xmx1024m-Xss512m  과같이 넣으면 된다.


참조:  http://hoonmaro.tistory.com/19

        http://limkydev.tistory.com/51

        http://atin.tistory.com/625

  https://blog.naver.com/kimso612/110028382119

  http://hyoje420.tistory.com/2



  1. freestrokes 2018.06.27 14:47 신고

    잘 정리하셨습니다.
    추가로 변수, 메서드, 인스턴스, Garbage Collector 등이 JVM에서 어떻게 동작하는지 알아봤으면 좋겠습니다.

    예제 코드에서 변수를 선언한 부분에 콤마(,)를 사용하였는데, 변수 선언시 권장하지 않는 방법입니다.
    아래 링크의 내용을 참고하여 확인해보시길 바랍니다.

    https://www.cs.umd.edu/~clin/MoreJava/ControlFlow/comma.html

    • 졸린눈 2018.06.27 16:12 신고

      좋은 정보 감사합니다.
      가비지 콜렉터가 어떻게 작동하는지 알아 보려 했었는데 추후 추가 업데이트 하도록 하겠습니다~~~

+ Recent posts