일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- gradle
- SpringBoot
- Java
- 이스티오
- 자바 ORM 표준 JPA 프로그래밍
- Real MySQL
- GC
- thread
- spring
- list
- 쿠버네티스
- IntellJ
- 백준
- 스트림
- Collection
- Stack
- 보조스트림
- JPA
- mysql
- K8s
- MSA
- OS
- Kotlin
- jvm
- 스프링
- 자바
- 토비의 스프링
- 토비의 스프링 정리
- redis
- Stream
- Today
- Total
인생을 코딩하다.
[Java] 재귀호출 구현 연습 및 코드 설명 본문
1. 프로세스 메모리
애플리케이션이 메모리에 로드되어 실행될 때, 이것을 운영체제 프로세스(process)라고 부른다.
프로세스가 차지하는 메모리는 몇 개의 세그먼트로 나뉘어진다.
1) Stack Segment
메소드가 호출되면, Stack Segment 영역에 그 메소드 공간이 할당된다.
이 공간에 그 메소드의 파라미터 변수, 지역 변수가 생성된다.
메소드가 리턴될 때, 이 메모리 공간도 제거된다.
재귀 호출이 무한 루프에 빠지면, Stack Segment 영역이 부족해져서
Stack Overflow Error가 발생한다.
Stack Overflow Error의 원인은 대부분 재귀 호출이 무한 루프에 빠진 것이다.
2) Data Segment
Data Segment 영역에 생성되는 변수는 다음과 같다.
- java 언어의 전역변수
- static 멤버 변수
- static 지역 변수
Data Segment에 생성된 변수들의 공통점은, 애플리케이션이 시작할 때 생성되어, 계속 존재하다는 것.
3) Heap Segment
new 연산자에 의해서 생성되는 객체, 배열은 Heap Segment 영역에 생성된다.
Java에서 모든 객체는 Heap Segment 영역에 생성된다.
C 언어의 malloc 함수로 할당한 메모리도 Heap Segment 영역에 생성된다.
객체를 너무 많이 생성하면 heap segment가 부족해 질 수 있다.
multi-thread programming 에서
스레드는 stack segment를 각각 따로 소유하고,
data segment, heap segment는 공유한다.
2. 메모 그림
아래 실습 코드 설명 그림에서 파란색 사각형은,
메소드가 호출될 때 Stack Segment 영역에 할당되는 메모리 공간이다.
이 공간을 차지하는 것은 파라미터 변수, 지역 변수이다.
아래 실습 코드 설명 그림에서 빨간색 사각형은,
Heap Segment 영역에 생성된 객체이다.
객체 공간을 차지하는 것은 객체의 인스턴스 멤버 변수이다. (instance memeber variable)
아래 그림에서 사각형은 참조 변수이다.
참조 변수는 heap segment 영역의 객체를 가르킨다.
즉 참조 변수에 들어있는 값은 heap segment 영역의 객체를 가르키는 참조값이다. (일종의 주소)
3. 실습 코드 설명
'Java' 카테고리의 다른 글
[Java] 자바8 Optional 기초 (0) | 2020.10.13 |
---|---|
[Java] 자바8 스트림(Stream) (2) | 2020.10.07 |
[Java] 자바8 람다식 기초 (0) | 2020.10.07 |
[Java] Garbage collection (2) (0) | 2020.09.12 |
[Java] Garbage collection (1) (0) | 2020.09.12 |