자바의 작동 원리

JunSeong_Park·2022년 12월 23일
0
post-custom-banner

JVM ( Java Virtual Machine )

물리적 컴퓨터인 하드웨어와 운영체제, 소프트웨어를 가상으로 모방한 것

JDK : Java Development Kit-자바 개발 도구 = JVM 소프트웨어 개발 도구
JRE : Java Runtime Environment-자바 실행 환경 = JVM 자바 실행 환경
JVM : Java Virtual Machine-자바 가상 기계 = 가상의 컴퓨터

그리고 하나 더 알아둬야할 점이 JDK 가 JRE 를 포함하고 그 안에 JVM 을 포함하여 한번에 배포하기 때문에 JRE 즉 실행 환경에 따른 버전구분이 필요하다. 그래서 JDK 를 Windows, Mac, Linux 로 구분하여 배포하는 구조를 가진다

객체 지향 프로그램의 메모리 사용 방식

  • 코드 실행 영역

  • 데이터 저장영역

    스태틱 (Static) 영역

    스택 (Stack) 영역

    힙 (Heap) 영역





main() 처리 방식

T 메모리 구조

1. java.lang 패키지 배치

2. 클래스와 임포트 패키지 배치


JRE 가 JVM 을 부팅하면 위와 같이 JVM 에서 전처리 작업을 한다

3. main() 메서드 스택 프레임 배치


스택 영역은 메서드별로 스택 프레임을 생성 ( 메서드의 여는 중괄호마다 스택 프레임 생성 )

4. main() 메서드 스택 프레임 내에 인자 변수 공간 생성


메서드의 인자 args 를 담을 변수 공간을 스택 프레임 밑에 확보

5. main 안의 함수 실행

위처럼 실행이 끝나면 닫는 중괄호와 함께 스택 프레임이 소멸된다



조금 더 응용해보자


위와 같은 코드를 실행한다 가정하면

4번째 줄까지

7번째 줄까지


if 블록 스택 프레임이 main() 스택 프레임 안에 생성되고 그 안에 int m 을 선언하였으니 변수 공간이 생성되는 것은 당연하지만 여기서 주목해야할 점은 if 프레임 안에서 그 밖에 있는 k 변수에 있는 메모리에 접근했다
즉 핵심은 외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다는 것이다



메서드 호출 프레임 예제도 보자

5번째 줄까지

스태틱 영역에 square까지 추가된 상태

11번째 줄까지

위의 스택 프레임을 자세히 보면 알겠지만 같은 이름의 변수 k 라해도 다른 프레임 안에 생성된 것을 볼 수 있다 ( 뭔가 thread 가 떠오른다 )

16번째 줄까지

17번째 줄까지

예상했던대로 닫는 중괄호와 함께 square() 스택 프레임이 사라지는 것을 알 수 있다

이번 예제들의 핵심은 각자의 스택 프레임 내에 생성된 변수 공간에는 서로 접근이 불가하다는 것이 핵심이다



전역 변수 사용 예제

4번째 줄까지

전역 변수를 사용하면 위처럼 스태틱 영역에 변수 공간이 할당된다

15번째 줄까지

보이는 대로 share 는 5+7 의 값을 가지고 -2 가 반환값으로 나온 상태이다

16번째 줄까지

닫는 중괄호가 닫히면서 fun() 메서드 스택 프레임이 사라지는데 k 가 fun() 의 반환값을 받은 것을 볼 수 있다

이런 과정을 통해 지역변수와 전역변수의 차이점을 쉽게 정리할 수 있다

  • 스택 프레임에 종속적인 지역 변수
  • 스택 프레임에 독립적인 전역 변수

Multi Thread와 Multi Process

멀티 스레드 : 스택 영역을 스레드 개수만큼 분할해서 사용
멀티 프로세스 : 다수의 데이터 저장 영역(다수의 T 메모리를 갖는 구조)

Ex) 멀티 스레드
Ex) 멀티 프로세스



스레드와 프로세스의 제일 핵심이 되는 차이점은 메모리를 공유할 수 있는 지에 대한 유무라고 생각한다
프로세스는 서로간의 데이터 영역이 별개로 하드웨어에 생성이 되기 때문에 접근할 수 있는 범위가 다르지만 스레드는 스택 영역을 통해서 서로 다른 스레드라해도 변수 공간에 접근할 수 있는 점이 핵심인 것 같다

참조 : 스프링 입문을 위한 자바

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다
post-custom-banner

0개의 댓글