JVM 메모리모델

 

  • JAVA - 운영체제 독립적.
bin 폴더:   .class 실행을 위한 파일
            (바로 실행되는 파일은 아니다. 이를 운영체제에 맞게 실행해주는 것이 JVM) 
            byte code
src 폴더:   .java 소스파일

 

.java
javac.exe / 1차 컴파일 ➜ byte code (OS독립적인 형태)
.class java.exe : jvm통해 실행
❹ 실행엔진 JVM에서 byte code를 각 OS에 맞게 2차 컴파일 ➜ exe code

 


프로그래밍의 3대 요소 : 변수(Variable), 자료형(Datatype), 할당(Assign)

  • 변수 : 기억공간. 데이터를 저장할 메모리 공간의 이름(symbol)
    변수 생성을 위해선 아래 두가지 조건이 필요하다.
    1. 크기
    2. 어떤 종류의 데이터를 저장할 것인가

  • 자료형 : 변수의 크기와 변수에 저장될 데이터의 종류(dataType)를 결정하는 것.

  • 할당 : 변수에 값을 저장(대입, 할당)하는 것.

 

기본자료형(PDT)

컴파일러에서 기본적으로 제공해주는 자료형
*정해져 있다.
int a =10; ➜ 메모리 : a [10]

 

사용자정의자료형(UDDT) - 객체 자료형(Object dataType)

필요에 의해서 새롭게 만들어 사용하는 자료형.
만드는 도구, 설계하는 도구, 모델링하는 도구가 필요하다. = class
ex) memberVO, bookDTO, String
객체(변수) Book b;b [번지] 메모리 : [번지수에 담긴 VO]
해당 번지로 저장된 값 메모리에서 찾아온다.
cf) VO - Value Object / DTO - data transfer object

 

변수선언

메모리에 기억공간을 만드는 것
변수가 선언되면 ST(변수테이블)에 등록된다.

ST테이블을 거쳐서 메모리에 접근.
ST테이블에 변수가 없을 시 ‘can not find symbol’ ERROR

 

Symbol Table(변수목록표)

변수가 기억공간을 할당받으면 변수의 번지가 등록되는 테이블

변수이름(key) 값(value)
a 100
b 200

 

Memory

Address
100번지 a 10
200번지 b 80

 


변수와 배열

  • Array(배열) : 객체. 동일타입 데이터를 여러개 저장하기 위한 연속적인 메모리 구조
  1. 많은 수의 변수를 만들기가 용이하다.
  2. 기억공간 접근이 쉽다. (반복문)
  3. 데이터 이동이 쉽다. (데이터를 하나의 형태로 담아서 이동)
  4. [단점] 서로 다른 데이터타입 (이질적구조, 객체)를 저장할 수 없다.

2차원 배열 : 1차원 배열이 여러개로 된 형태 cf) a라는 아파트에 3개(a[0], a[1], a[2])동이 있고 각 동은 3층이다.


 

메서드와 변수의 공통점

  • 변수와 메서드는 둘 다 1개의 값을 가진다.
  • 변수 앞에 데이터 타입을 선언하듯, 메서드명 앞에 데이터 타입 선언

 

메서드의 매개변수 전달기법

parameter를 어떻게 전달하느냐에 따라 값전달/번지전달 기법이 나뉜다.

  • Call by Value (값 전달 기법) : 기억공간 개별
  int a = 10;
  int b = 20;
  int v = sum(a, b);  // 메서드 호출부
   //호출부에 들어가는 인수값들을 '실인수'라고 하며
 public int sum (int a, int b) { // 받는 메소드의 파라미터를 '매개변수' 또는 '가인수' 라고한다.
 }
  • 메서드가 호출되려면 ‘실인수’와 ‘가인수’의 개수와 데이터타입이 같아야한다.

  • Call by Reference (번지 전달 기법) : 기억공간 공유

 int[] arr = {10, 20, 30}; // 중괄호 부분 '{ }'를 초기화 리스트 라고한다. 생성과 동시에 초기화.

arr은 객체 = 번지가 저장되어있다. 함수가 호출되면 번지가 전달된다.
즉, 메소드에서 받을떄 같은 번지를 참조하게 되어 같은 기억공간을 공유하게 된다.

 


 

JVM Memoery Model

 

JVM이 class를 실행하는 절차

  1. 해당 클래스를 현재 디렉토리에서 찾는다.
    • 성공 : 해당 클래스를 찾음
    • 실패 : 해당 클래스를 찾지 못함. 환경변수 classpath변수에 디렉토리를 잡아줄 수 있다.
  2. 찾으면 클래스 내부에 있는 static키워드가 있는 메서드를 메모리로 로딩한다.
    • 프로그램이 시작하기 전에 로딩된다.
    • method Area의 static zone에 로딩한다. main() method
  3. static zone에서 main()메소드를 실행한다. (호출, 시작)
    • main() method가 호출되면 호출정보가 stack Area에 들어간다. (push)
    • 프로그램이 시작되는 부분이다.
    • PC[프로그램카운터]의 위치가 현재 동작되고 있는 메서드다.
  4. stack Area가 비어 있으면 프로그램이 종료된 것이다.

 

  • 예시

public class TPC08 {

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        TPC08 tpc = new TPC08();
        int v = tpc.add(a, b); //add() call
        System.out.println(v);
    }

    public int add(int a, int b) {
        int sum = a + b;
        return sum;
    }

}

위 코드는 아래와 같이 설명된다.

jvm

Stack Area : LIFO (Last In, First Out)
static메소드가 아닌 add는 Method Area의 non-static 메소드에 기계어로 기억공간이 만들어지고, Heap Area에 올라온 add는 method Area의 add의 ‘번지’를 담게된다. (pointer로 연결)


 

reference

인프런 강의 : JAVA TPC