자바 개발 도구인 JDK를 이용해 개발된 프로그램은 JRE에 의해 가상의 컴퓨터인 JVM상에서 구동됨
- JDK(Java Development Kit) : 자바 개발 도구, JVM용 소프트웨어 개발 도구로 JRE를 포함하고 자바 소스 컴파일러인 javac.exe를 포함함
- JRE(Java Runtime Environment) : 자바 실행 환경, JVM용 OS로 JVM을 포함하고 자바 프로그램 실행기인 java.exe를 포함함
- JVM(Java Virtual Machine) : 자바 가상 기계, 가상의 컴퓨터
메모리 상에서 구동 방식
- 프로그램은 메모리를 코드 실행 영역과 데이터 저장 영역으로 구분해 사용함

- 데이터 저장영역은 static, stack, heap영역으로 구분됨(T메모리 구조)
static : 클래스들의 놀이터
—————————————————————————
stack : 메서드들의 놀이터
heap : 객체들의 놀이터
- JRE는 프로그램안에 main( )메서드가 있는지 확인
- main( )메서드가 확인되면 JRE는 JVM을 부팅하고 JVM은 전처리 과정에 돌입
- 부팅된 JVM이 처음으로 사용되는 패키지나 클래스를 static영역에 배치
클래스가 처음 사용될때는 다음 중 하나
- 클래스의 정적 속성을 사용할때
- 클래스의 정적 메서드를 사용할때
- 클래스의 인스턴스를 최초로 만들때
- 그 다음 JVM은 개발자가 작성한 모든 클래스와 import한 패키지도 static영역에 배치
- 클래스 멤버 변수(전역 변수)는 JVM이 종료될때까지 스태틱 영역에 저장되며 스택 프레임에 독립적임
- stack frame이 메모리의 stack영역에 할당됨(스택 프레임은 클래스 정의를 제외한 여는 중괄호를 만날 때마다 하나씩 생기고 닫는 중괄호로 소멸됨)
- 메서드의 인자들을 저장할 변수 공간을 스택 프레임의 맨 밑에 할당함
지역 변수들은 스택 프레임에 저장되고 스택 프레임이 사라지면 함께 사라짐
💡외부 스택 프레임에서 내부 스택 프레임의 변수에 접근할 수는 없지만 그 역은 가능하다.단, 메서드 스택 프레임들 간 변수를 참조하는 것은 불가능하다.
메서드 간에는 입력값들(인자 리스트)과 반환값으로만 값이 전달되고 내부의 지역변수를 볼수 없다.
💡Call By Value : 메서드를 호출하면서 인자로 전달되는 것은 변수 자체가 아니라 변수가 저장한 값만을 복제해서 전달함
(* 전역변수로 값을 전달하고 반환할 수 있지만 읽기 전용이 아닌 이상 값을 추적하기 어려우므로 안쓰는게 좋음)- static메서드를 포함한 모든 메서드 안에 선언된 변수들을 메서드의 스택 프레임에 아래부터 차곡차곡 쌓아 저장함.
스택 프레임에 저장된 변수 구조(맨 아래부터) 메서드의 지역 변수 인자(메서드의 매개변수)를 저장할 변수 공간 반환값을 저장할 변수 공간
- if문, for문과 같은 블록이 있으면 스택 프레임 안에 블록 스택 프레임이 생성되고 해당 블록 안에서 사용되는 변수는 블록 스택 프레임안에 저장됨
- 해당 블록이 닫히면 블록 스택 프레임이 사라지고 그안에 있던 변수도 사라짐
→ 따라서 블록 실행후 블록 내부의 변수를 블록 밖에서 사용하려고 하면 컴파일 오류 발생
- static메서드를 포함한 모든 메서드 안에 선언된 변수들을 메서드의 스택 프레임에 아래부터 차곡차곡 쌓아 저장함.
- main( )메서드가 끝나면 T메모리는 사라지고 JRE는 JVM을 종료하고, JRE가 사용했던 시스템 자원을 운영체제에 반납함(JRE가 메모리 상에서 사라짐)
멀티 스레드 vs 멀티 프로세스
멀티 스레드
- 멀티 스레드는 T메모리의 스택 영역을 스레드 개수만큼 분할해서 사용함
- 하나의 스레드에서 다른 스레드의 스택 영역에 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하므로 멀티 프로세스보다 메모리 적게 사용
- 전역변수 사용시 스레드에서 예상치 못한 전역변수 값이 저장되므로 문제발생 → lock을 걸어 보완할 수 있으나 멀티 스레드의 장점을 버림
멀티 프로세스
- 멀티 프로세스는 다수의 데이터 저장영역(T메모리)를 갖는 구조
- 하나의 프로세스가 다른 프로세스의 T메모리 영역에 접근할 수 없으므로 안전한 구조지만 그만큼 메모리 사용량이 큼
가비지 컬렉션(Garbage Collection)
- 더이상 사용하지 않는 객체가 JVM에 의해 주기적으로 감지되고 이런 객체가 차지하고 있던 메모리가 가용 메모리로 자동 환원되는 메모리 관리 기능
- C++은 개발자가 코드 내에서 객체의 소멸 시점을 결정해 delete연산자로 명시적으로 메모리 환원시킴
- 자바는 자동 가비지 컬렉션 기능을 제공하므로 프로그램 성능이 조금 떨어짐
- 부팅된 JVM이 처음으로 사용되는 패키지나 클래스를 static영역에 배치
클래스가 처음 사용될때는 다음 중 하나
- 클래스의 정적 속성을 사용할때
- 클래스의 정적 메서드를 사용할때
- 클래스의 인스턴스를 최초로 만들때
Uploaded by N2T
'Java' 카테고리의 다른 글
Java 기초 문법(2) (0) | 2023.12.20 |
---|---|
Java 기초 문법(1) (0) | 2023.12.20 |
팩토리 메서드 패턴을 적용해보자 (0) | 2023.10.26 |
템플릿 메서드 패턴을 적용해보자 (0) | 2023.10.26 |
static 메서드는 언제 사용해야할까? (1) | 2023.10.26 |