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) 영역
JRE 가 JVM 을 부팅하면 위와 같이 JVM 에서 전처리 작업을 한다
스택 영역은 메서드별로 스택 프레임을 생성 ( 메서드의 여는 중괄호마다 스택 프레임 생성 )
메서드의 인자 args 를 담을 변수 공간을 스택 프레임 밑에 확보
위처럼 실행이 끝나면 닫는 중괄호와 함께 스택 프레임이 소멸된다
위와 같은 코드를 실행한다 가정하면
if 블록 스택 프레임이 main() 스택 프레임 안에 생성되고 그 안에 int m 을 선언하였으니 변수 공간이 생성되는 것은 당연하지만 여기서 주목해야할 점은 if 프레임 안에서 그 밖에 있는 k 변수에 있는 메모리에 접근했다
즉 핵심은 외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다는 것이다
스태틱 영역에 square까지 추가된 상태
위의 스택 프레임을 자세히 보면 알겠지만 같은 이름의 변수 k 라해도 다른 프레임 안에 생성된 것을 볼 수 있다 ( 뭔가 thread 가 떠오른다 )
예상했던대로 닫는 중괄호와 함께 square() 스택 프레임이 사라지는 것을 알 수 있다
이번 예제들의 핵심은 각자의 스택 프레임 내에 생성된 변수 공간에는 서로 접근이 불가하다는 것이 핵심이다
전역 변수를 사용하면 위처럼 스태틱 영역에 변수 공간이 할당된다
보이는 대로 share 는 5+7 의 값을 가지고 -2 가 반환값으로 나온 상태이다
닫는 중괄호가 닫히면서 fun() 메서드 스택 프레임이 사라지는데 k 가 fun() 의 반환값을 받은 것을 볼 수 있다
이런 과정을 통해 지역변수와 전역변수의 차이점을 쉽게 정리할 수 있다
멀티 스레드 : 스택 영역을 스레드 개수만큼 분할해서 사용
멀티 프로세스 : 다수의 데이터 저장 영역(다수의 T 메모리를 갖는 구조)
Ex) 멀티 스레드
Ex) 멀티 프로세스
스레드와 프로세스의 제일 핵심이 되는 차이점은 메모리를 공유할 수 있는 지에 대한 유무라고 생각한다
프로세스는 서로간의 데이터 영역이 별개로 하드웨어에 생성이 되기 때문에 접근할 수 있는 범위가 다르지만 스레드는 스택 영역을 통해서 서로 다른 스레드라해도 변수 공간에 접근할 수 있는 점이 핵심인 것 같다