
JDK JRE JVM

JDK: Java Development Kit, 자바 개발 키트
Java SE 스펙을 준수한 구현체.
자바 기반 소프트웨어를 개발하기 위한 도구들로 이루어진 패키지와 JRE 를 포함한다.
자바 소스 컴파일러 javac.exe 를 포함하고 있다.
JRE: Java Runtime Environment, 자바 실행 환경
자바 코드를 실행하기 위한 도구들로 구성된 패키지.
자바 프로그램을 구동하기 위한 독립된 구성요소로 사용할 수 있지만, 동시에 JDK 의 일부이기도 하다.
자바 프로그램 실행기 java.exe 를 포함하고 있다.
JVM: Java Virtual Machine, 자바 가상 머신
자바 코드가 컴파일된 바이트 코드 파일을 실행하는 가상머신.
애플리케이션을 운영체제에 무관하게 실행 가능하게 해준다.
자바에 존재하는 절차적 / 구조적 프로그래밍의 유산
절차적 프로그래밍 - goto 를 쓰지 않는 것
자바에는 goto, const 를 쓰지 못하도록 예약어로 등록, not used 로 되어있다.
goto 를 사용하면 프로그램의 실행 순서 파악이 어려워진다. 다른 언어의 const 가 자바에서는 final 이다.
구조적 프로그래밍 - 함수를 사용하는 것
함수는 논리적 단위의 블록이다 (함수의 목적: ① 논리의 분할 ② 중복 제거)
메모리

위 그림에서 데이터 저장 역역의 삼분할 구조 - static / stack / heap 영역
Static 영역 ← 클래스
Stack 영역 ← 메서드
Heap 영역 ← 객체
main() 메서드는 프로그램의 시작점이자 끝이다.
JRE 는 프로그램에 main() 메서드가 있는지 확인하여 JVM 을 부팅한다.
부팅된 JVM 은 목적 파일을 실행한다.
① 가장 먼저 java.lang 패키지를 static 영역에 올린다.
② 프로그램에 작성된 클래스와 import 된 패키지를 static 영역에 올린다.
(사실 패키지, 클래스는 처음 사용될 때 static 영역에 로드된다)
클래스의 여는 중괄호를 제외한 '여는 중괄호'를 만날 때마다 stack 영역에 '스택 프레임'이 하나씩 생긴다.
여는 중괄호로 스택 프레임이 생성되고 닫는 중괄호로 스택 프레임이 소멸된다.
③ main() 메서드의 스택 프레임이 stack 영역에 만들어진다.
④ 메서드의 인자 args 를 저장할 변수 공간이 스택 프레임 안에 할당된다.
그 이후에 main() 메서드의 첫 명령문을 실행하게 된다. (메모리에서 실행 영역은 데이터 저장 영역과 별도)
⑤ 메서드를 닫는 중괄호와 함께 stack 영역에서는 스택 프레임이 소멸된다.
main() 메서드가 끝나면 JRE 는 JVM 을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
⨳ 메서드 스택 프레임 말고도, if 문, for문 과 같은 블록에서도 스택 프레임이 생성되고 소멸된다.
(if 문의 경우, 조건식이 참인 경우의 스택 프레임만 생성된다)
이때 메서드 스택 프레임 안에 중첩되어 블록 스택 프레임이 생긴다.
당연히 블록 내부에서 정의한 변수는 블록 밖에서 접근할 수 없다.
외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다.
지역 변수 : Stack 영역의 스택 프레임, 스택 프레임이 사라지면 함께 사라진다
클래스 멤버 변수 : Static 영역, JVM 이 종료될 때까지 고정된 상태로 존재
객체 멤버 변수 : Heap 영역, 객체와 함께 가비지 컬렉터에 의해 소멸된다
Call By Value vs Call By Reference
Call By Value : 값에 의한 호출, 함수가 인수로 전달하는 값만을 복사하여 전달
함수 안에서 인자의 값이 변경되어도 외부에 있는 원래 변수는 값이 변경되지 않음
Call By Reference : 참조에 의한 호출, 함수 호출 시 인수의 참조 값을 전달
함수 안에서 인자로 전달된 값을 변경하면 호출한 쪽에서도 해당 변수의 값이 변경됨
→ 바꾸고 싶지 않으면 깊은 복사를 하쟈 (๑'ᵕ'๑)⸝*
메서드의 블랙박스화
입력 값들과 반환 값에 의해서만 메서드 사이에서 값이 전달될 뿐, 서로 내부의 지역 변수를 볼 수는 없다
전역 변수 쓰지 말라니까요!
지역 변수는 스택 프레임에 종속적, 전역 변수는 스택 프레임에 독립적
이 값을 여러 곳에서 변경하기 시작하면 저장된 값을 파악하기 어려워진다.
전역 변수를 쓸거라면, 읽기 전용으로 값을 공유하는 전역 상수로 쓰는 것이 좋다.
멀티 스레드 / 멀티 프로세스
멀티 스레드 → stack 영역을 스레드의 개수만큼 분할
멀티 프로세스 → 다수의 데이터 저장 영역 (T 메모리) 를 갖는 구조
멀티 스레드는 : 서로 다른 stack 영역은 접근할 수 없지만 static 영역, heap 영역은 공유한다
쓰기 가능한 전역 변수를 사용하면 스레드 안전성이 깨진다
*서블릿은 요청 당 프로세스가 아닌 요청 당 스레드를 생성한다 (메모리를 효율적으로 사용)
'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 5. SOLID (0) | 2024.05.25 |
자바 객체 지향의 원리와 이해 4. 객체 지향 (2) (0) | 2024.05.22 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |

JDK JRE JVM

JDK: Java Development Kit, 자바 개발 키트
Java SE 스펙을 준수한 구현체.
자바 기반 소프트웨어를 개발하기 위한 도구들로 이루어진 패키지와 JRE 를 포함한다.
자바 소스 컴파일러 javac.exe 를 포함하고 있다.
JRE: Java Runtime Environment, 자바 실행 환경
자바 코드를 실행하기 위한 도구들로 구성된 패키지.
자바 프로그램을 구동하기 위한 독립된 구성요소로 사용할 수 있지만, 동시에 JDK 의 일부이기도 하다.
자바 프로그램 실행기 java.exe 를 포함하고 있다.
JVM: Java Virtual Machine, 자바 가상 머신
자바 코드가 컴파일된 바이트 코드 파일을 실행하는 가상머신.
애플리케이션을 운영체제에 무관하게 실행 가능하게 해준다.
자바에 존재하는 절차적 / 구조적 프로그래밍의 유산
절차적 프로그래밍 - goto 를 쓰지 않는 것
자바에는 goto, const 를 쓰지 못하도록 예약어로 등록, not used 로 되어있다.
goto 를 사용하면 프로그램의 실행 순서 파악이 어려워진다. 다른 언어의 const 가 자바에서는 final 이다.
구조적 프로그래밍 - 함수를 사용하는 것
함수는 논리적 단위의 블록이다 (함수의 목적: ① 논리의 분할 ② 중복 제거)
메모리

위 그림에서 데이터 저장 역역의 삼분할 구조 - static / stack / heap 영역
Static 영역 ← 클래스
Stack 영역 ← 메서드
Heap 영역 ← 객체
main() 메서드는 프로그램의 시작점이자 끝이다.
JRE 는 프로그램에 main() 메서드가 있는지 확인하여 JVM 을 부팅한다.
부팅된 JVM 은 목적 파일을 실행한다.
① 가장 먼저 java.lang 패키지를 static 영역에 올린다.
② 프로그램에 작성된 클래스와 import 된 패키지를 static 영역에 올린다.
(사실 패키지, 클래스는 처음 사용될 때 static 영역에 로드된다)
클래스의 여는 중괄호를 제외한 '여는 중괄호'를 만날 때마다 stack 영역에 '스택 프레임'이 하나씩 생긴다.
여는 중괄호로 스택 프레임이 생성되고 닫는 중괄호로 스택 프레임이 소멸된다.
③ main() 메서드의 스택 프레임이 stack 영역에 만들어진다.
④ 메서드의 인자 args 를 저장할 변수 공간이 스택 프레임 안에 할당된다.
그 이후에 main() 메서드의 첫 명령문을 실행하게 된다. (메모리에서 실행 영역은 데이터 저장 영역과 별도)
⑤ 메서드를 닫는 중괄호와 함께 stack 영역에서는 스택 프레임이 소멸된다.
main() 메서드가 끝나면 JRE 는 JVM 을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
⨳ 메서드 스택 프레임 말고도, if 문, for문 과 같은 블록에서도 스택 프레임이 생성되고 소멸된다.
(if 문의 경우, 조건식이 참인 경우의 스택 프레임만 생성된다)
이때 메서드 스택 프레임 안에 중첩되어 블록 스택 프레임이 생긴다.
당연히 블록 내부에서 정의한 변수는 블록 밖에서 접근할 수 없다.
외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다.
지역 변수 : Stack 영역의 스택 프레임, 스택 프레임이 사라지면 함께 사라진다
클래스 멤버 변수 : Static 영역, JVM 이 종료될 때까지 고정된 상태로 존재
객체 멤버 변수 : Heap 영역, 객체와 함께 가비지 컬렉터에 의해 소멸된다
Call By Value vs Call By Reference
Call By Value : 값에 의한 호출, 함수가 인수로 전달하는 값만을 복사하여 전달
함수 안에서 인자의 값이 변경되어도 외부에 있는 원래 변수는 값이 변경되지 않음
Call By Reference : 참조에 의한 호출, 함수 호출 시 인수의 참조 값을 전달
함수 안에서 인자로 전달된 값을 변경하면 호출한 쪽에서도 해당 변수의 값이 변경됨
→ 바꾸고 싶지 않으면 깊은 복사를 하쟈 (๑'ᵕ'๑)⸝*
메서드의 블랙박스화
입력 값들과 반환 값에 의해서만 메서드 사이에서 값이 전달될 뿐, 서로 내부의 지역 변수를 볼 수는 없다
전역 변수 쓰지 말라니까요!
지역 변수는 스택 프레임에 종속적, 전역 변수는 스택 프레임에 독립적
이 값을 여러 곳에서 변경하기 시작하면 저장된 값을 파악하기 어려워진다.
전역 변수를 쓸거라면, 읽기 전용으로 값을 공유하는 전역 상수로 쓰는 것이 좋다.
멀티 스레드 / 멀티 프로세스
멀티 스레드 → stack 영역을 스레드의 개수만큼 분할
멀티 프로세스 → 다수의 데이터 저장 영역 (T 메모리) 를 갖는 구조
멀티 스레드는 : 서로 다른 stack 영역은 접근할 수 없지만 static 영역, heap 영역은 공유한다
쓰기 가능한 전역 변수를 사용하면 스레드 안전성이 깨진다
*서블릿은 요청 당 프로세스가 아닌 요청 당 스레드를 생성한다 (메모리를 효율적으로 사용)
'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 5. SOLID (0) | 2024.05.25 |
자바 객체 지향의 원리와 이해 4. 객체 지향 (2) (0) | 2024.05.22 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |