지구정복

[Java] JVM과 메모리 사용 영역 본문

데이터 엔지니어링 정복/JAVA & JSP

[Java] JVM과 메모리 사용 영역

eeaarrtthh 2020. 10. 23. 13:14
728x90
반응형

 

 

ㅇJVM이란?

  자바 가상 기계(Java Virtual Machine)로 바이트 코드 파일을 운영체제를 위한 완전한 기계어로 변역하고 실행하는

  역할을 한다.

  JVM의 구성은 다음과 같다.

   1. 자바 인터프리터

      자바 바이트 코드를 읽고 해석하는 역할

   2. 클래스 로더

      자바는 동적으로 클래스를 읽어온다. 프로그램이 실행 중인 런타임이 되어야 모든 코드가 JVM과 연결된다.

   3. JIT 컴파일러

      프로그램이 실행 중인 런타임때 실제 기계어로 변환해주는 컴파일러

   4. 가비지 컬렉터

      더는 사용하지 않는 메모리를 자동으로 회수해주는 역할. 따라서 개발자는 따로 메모리 관리가 필요없다.

 

ㅇ바이트 코드 파일이란?

  자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미합니다.

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

  자바 바이트 코드의 확장자는 .class 이고, 자바 가상 머신만 설치되어 있으면 어떤 운영체제에서 실행가능

 

 

 

ㅇJVM의 메모리 사용 영역

 -Static 영역

  class영역 또는 method영역이라고 불림.

  패키지나 클래스 정보가 올라간다. (프로그램 시작과 동시에 올라가는 것이 아닌 실제 호출시 올라감)

  static영역에 있는 것은 어떤 곳에서나 접근이 가능해지기 때문에 '전역'이라는 키워드 사용

  따라서 읽기 전용이 아닌 경우 가급적 사용하지 말아야 한다.

  static 영역에 자리잡게되면 JVM이 종료될 때까지 사라지지 않고 static(고정된) 상태를 유지.

  코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을

        분류해서 저장한다.

 

 -stack 영역

  여는 중괄호( { )를 만날 때마다 스택 프레임이 하나씩 생기고, 닫는 중괄호( } )를 만나면 스택 프레임 소멸

  메소드를 호출할 때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임 제거(pop)하는 동작 수행

  stack 영역에 변수가 생성되는 시점은 최초로 변수에 값이 저장될 때 (=변수가 초기화될 때)

  기본 타입 변수의 값들은 stack영역에 저장되고, 참조 타입 변수는 참조값만(변수의 주소) 저장

       (이 참조값은 heap영역에 존재하는 객체를 가르키는 역할을 한다.)

  

 -heap 영역

  객체와 배열이 생성되는 영역, 여기에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조

  흔히 'new' 명령을 통해 생성된 인스턴스 변수가 놓이게 된다.

  참조 타입 변수를 stack 영역에 할당하지 않고 별도의 heap 영역에 할당하는 이유는 소멸방법과 소멸시점이 

        지역변수(stack영역에 할당되는 것들)와는 다르기 때문.

 

+추가

  참조변수들은 실행될 때마다 많은 데이터들을 스택메모리 영역에 넣었다 뺐다 하는 과정이 비효율적이므로

  힙 영역에 그 내용(진짜 값)이 저장되고, 스택 메모리에는 간단하게 그 주소만 저장되는것.

 

 

+간단하게 정리

 static 영역: 패키지나 클래스정보(정적필드/상수, 메소드, 생성자 등)가 올라간다.

 heap 영역: 객체와 배열이 생성된다. 참조 타입 변수의 실제 값들이 저장된다.

 stack 영역: { 열리면 프레임 생성되고 이 프레임 안에 기본 타입 변수의 값, 참조 타입 변수의 주소가 저장되며 } 닫히면

               프레임 종료

 

 

 

[출처]

혼자공부하는자바-신용권

tcpschool.com/java/java_intro_program

siyoon210.tistory.com/124

blog.wanzargen.me/17(코드로 쉽게 알려줌)

728x90
반응형

'데이터 엔지니어링 정복 > JAVA & JSP' 카테고리의 다른 글

[JAVA] 메소드  (0) 2020.10.26
[JAVA] 생성자  (0) 2020.10.26
[JAVA] 필드  (0) 2020.10.26
[JAVA] 객체와 클래스  (0) 2020.10.26
[Java] 자바 개발 도구 설치 방법  (0) 2020.10.21
Comments