![](https://velog.velcdn.com/images/soyoungkangme/post/56112d22-dde4-4d22-87fd-ff9251d84e6e/image.png)
![](https://velog.velcdn.com/images/soyoungkangme/post/50249f15-3913-4859-812e-b58510f721f0/image.png)
- 메모리 입장에서는 static 보다는 로컬 변수가 좋지만 JVM이 할일이 많아짐 (
변수를 램에 로드, 해제
)
- 컴 = cpu ram + ssd + 하드
- ssd, 하드에 실행 안하는 프로그램 코드로 저장 (비휘발)
- 하드에서 코드 가져와서 프로그램 ram 에서 코드 실행 (
실행 중인 프로그램 = 프로세스
- 스트리밍, 클라우드)
- stack, heap, data, code 는 물리적으로는 하나의 공간.
바이트로 나눠서 침범하면 오버플로우
stack
int, double, float
(원시타입의 일반변수)
- stack overflow → 컴파일 될때 데이터 사이즈 4byte로 크기 정해짐
int a = 1233820498209482938049820830492;
→ 너무 커서 컴파일 에러
- 함수 호출시 생성되는 지역변수, 매개변수 → 함수 호출 완료되면 메모리 해제
heap
참조(reference) 변수
- 객체타입의 변수 (String → 바이트 정해져있지 않음)
- 부족하면 heap overflow
- 지역변수이긴 한데, 맨 앞글자가 대문자
- 논리적으로 분리되어 있지만, 물리적으로 같은 공간 공유
프로그래머가 할당/해제 하는 메모리 공간
- 자바에서는 직접 해제하지 않고
GC
가 사용하지 않는 메모리를 해제함
- 이 공간에 메모리 할당하는 것을
동적할당
이라고 함 → 실행도중 (런타임) 에 크기 알 수 있음 (JVM이 생성, 소멸)
data
- 전역 변수, 정적 변수 (static)
- 프로그램 시작과 동시에 할당되고, 프로그램 종료되어야 메모리 소멸되는 영역
code
실행할 프로그램에서 우리가 작성한 소스코드, 텍스트