들어가며...
안녕하세요.
돌고 돌아 돌아온 Minter입니다.
저는 사실 KT CLOUD TECH UP 백엔드 과정을 수강 중입니다.
과제 제출 마감이 얼마 남지 않았습니다.
빈약한 저의 TIL 시작합니다..
시작은 미약하나 끝은 창대하리라;;
완벽한 중도포기보다 불완벽한 완주가 낫다;;
점점 더 수정할게요. 오류 정정과 다양한 비판 적극 수렴
+ 강사님 죄송해요

목차
1. JVM
2. Thread
3. GC
4. 초간단 정리
5. I am going to...
JVM
무엇인가(What)
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 실행 환경임
- 소스 코드
(.java)를 바로 실행하지 않고, 바이트코드( *.class)로 변한한 뒤, JVM 위에서 실행함
- 간단하게 얘기해서 자바 프로그램을 실행하는 하나의 소프트웨어 기반 컴퓨터라고 보면 됨
왜 쓰는가(Why)
플랫폼 독립성의 확보를 위해 사용함
💊PAIN POINT
- 기존 언어는 OS, CPU 아키텍쳐에 따라 실행 파일이 달랐기 때문에, 같은 프로그램이라도 환경이 바뀌면 다시 컴파일 해야함
💉JVM을 활용하면
- 소스코드 → 바이트 코드로 한 번의 컴파일 과정을 거침
- 실행 환경은 어떤 플랫폼이든 JVM 위에서 동작함
- WORA(Write Once, Run AnyWhere)
- 한 번 작성하고 어디에서든 동작
- JVM은 통합 런타임 환경이다
- 메모리 관리(GC)
- 실행 최적화(JIT 컴파일러)
- 보안 (바이트 코드 검증)
어떻게 동작하는가(How)
1. 컴파일 단계
2. 클래스 로딩
3. 실행 단계
4. 메모리 관리
| 언어 | 소스코드 | 컴파일러 | 결과물 |
|---|
| Java | .java | javac | .class |
| C | .c | gcc | 실행 파일(.exe) |
| Python | .py | - | 즉시 실행 |
- 컴파일 단계
.java 파일을 javac 컴파일러를 통해 .class(바이트코드)로 컴파일 한다
- 클래스 로딩
- Class Loader가
.class 파일을 읽어 메모리에 적재한다.
- 실행 단계
- 실행 엔진(Execution Engine)이 바이트 코드를 실행한다
- 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 실행한다
- 메모리 관리
- JVM은 런타임 데이터 영역(Runtime Data Area)을 사용한다
- 핵심 구조
- Heap : 객체 저장 (GC의 관리 대상)
- Stack: 메서드 실행 정보
- Method Area(메소드 영역): 클래스 정보
Thread
무엇인가(What)
스레드란 프로세스 내부에서 실행되는 작업의 최소 단위(Job)이다.
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있다
- 이들은 동일한 메모리 공간(= Heap)을 을 공유하며, 동시에 실행됨
주의
- 프로세스
- 프로그램이 주기억장치에 적재되어 CPU 및 자원을 점유하는 상태
왜 쓰는가(Why)
CPU 자원을 효율적으로 사용하기 위해
💊pain point
단일 스레드 환경에서는 I/O 대기, 사용바 입력 대기 상황이 존재하면 CPU가 작업을 수행할 수 없음
💉 스레드를 활용하면?
- 멀티 스레드를 활용하면 각자 다른 작업을 수행하는 것이 가능해짐
- 현대 CPU는 멀티 코어 구조이므로, 여러 스레드를 통해 병렬 실행 가능
- CPU를 최대한 활용하고, 프로그램의 응답성을 높이기 위해 사용함
어떻게 쓰는가 (How)
01. 흐름
1. Java에서 Thread 객체 생성
2. start() 호출
3. JNI통해 JVM 내부 호출
4. JVM이 OS 스레드 생성 요청
5. OS가 커널 스레드 생성
6. 스케줄러가 CPU에 할당
- 실제 실행은 OS, CPU가 담당
- Java 스레드 = OS 커널 스레드(1:1 매핑)
02. 메모리 구조 관점
- Heap → 모든 스레드 공유
- Stack → 각 스레드마다 별도 생성
- 데이터 공유 쉬움 → 동기화 문제 발생 가능
03. 스케줄링과 컨텍스트 스위칭
컨텍스트 스위칭이란 현재 스레드의 상태를 저장하고, 다음 스레드 상태를 복원하는 것임
스위칭 비용이 크기 때문에 스레드가 많아질수록 성능이 떨어질 수 있음
04. Thread Pool
미리 스레드를 생성해두고 재사용 하는 방식
- 스레드 생성 비용이 크기 때문에 미리 스레드를 생성해두고 재사용하는 방식인 Thread Pool 이 사용됨
- 커널 레벨의 스레드를 미리 만들어 두는 것과 같음
GC(Garbage Collector)
무엇인가(What)
JVM에서 사용되지 않는 객체를 자동으로 제거하는 메모리 관리 기능
왜 쓰는가(Why)
💊 Pain Point
💉 GC를 사용하면?
- 메모리 누수 방지
- 프로그램 안정성 향상
- 개발자 부담 감소
- C/C++에서는 메모리를 직접 해제해야 하지만, Java에서는 GC가 이를 대신 수행함 ⇒ 메모리 관리 자동화
어떻게 동작하는가 (How)
GC는 Heap 영역을 기준으로 동작한다
1. 객체 생성 (Heap 영역)
2. 객체가 더 이상 참조되지 않음
3. GC가 해당 객체 탐지
4. 메모리 회수
cf) 객체가 생성되면 당.연.히. 메모리를 차지함
정리
| 이름 | 핵심 |
|---|
| JVM | 실행 환경 제공 |
| Thread | 실제 실행 담당 |
| Heap | 객체는 Heap에 생성 |
| GC | 메모리 정리 |
연관 개념 및 기술(앞으로 공부할 것)
사진이 너무 무서워요