티스토리 뷰
Stack과 Heap은 메모리의 종류이다.
두개를 한 곳에 정리하는 이유는 둘은 밀접한 관계를 가지고 있기 때문이다.
Heap을 설명하기 전에 Stack을 먼저 이해해야하는데
기본적인 Stack의 동작과정은 아래와 같다.
1)Stack
main( ) work( ) more( ) 세개의 메소드와 각 메소드 마다 int 형 abc변수를 넣어 실행시키면
stack 메모리는 다음과 같은 변화가 생긴다.
위에서 실행된 코드부터 Stack메모리에 저장되는데 main()이 가장 위에 있기때문에 a를 가장 먼저 저장한다.
그 뒤에 있는 b값을 저장한다.
마지막으로 c값을 저장한다.
그리고 짜여진 프로그램이 끝나는 지점에서 stack메모리에 pop 현상이 일어난다.
pop현상은 스택메모리에 저장된값이 삭제되는거라고 이해하면 되는데 이 현상에는 한가지 규칙이있다.
삭제는 가장 늦게 입력된 값부터 삭제를 진행한다.
즉 전문적으로 말하면 stack 메모리에서 top에 저장된 값부터 pop한다.
more()의 코드가 가장 마지막에 실행되어서 stack메모리에 top에 위치해 있다. 코드가 순서대로 다 실행되고 나면 이제
stack 메모리 top에 있는 more()은
pop현상이 일어난다.
이런식으로 pop현상이 일어나게 되고 마지막에는 a값도 pop현상이 일어나 stack은 초기와 같이 비어있게
된다.
쉽게 설명해 stack은 임시적으로 메모리를 저장하는 공간이라고 생각할 수 있다.
Stack과 밀접한 관련이 있는 메모리는 heap인데 이제 Stack의 기본적인 구조를 알았으니 heap을 알아보도록 하자.
이런 구조의 코드가 있다 a값은 정상적으로 stack에 저장된다. 그리고 a는 a그 자체로 오브젝트이다. 그렇기에 heap에 연결되는 일 없이 stack안에서만 저장되어있다.
그런데 Car항목은 다르다 일단 myCar라는 값이 stack에 추가된다. 참조 변수의 이름이 myCar 이므로 stack저장되는 것은 myCar
그런데 밑에서 new 연산자를 사용해서 Car라는 객체를 heap안에 새로 만들었다. 여기서 car의 값은 heap에 저장되는데, 여기서 주의해야 하는 점은 myCar는 객체가 아니다. stack저장된 mycar는 heap안에 있는 car객체와 연결되기위한 주소라고 생각하면된다.
끝으로 stack과 heap에 가장 큰 차이점 이라면 stack은 pop으로 데이터가 지워지는 일시적으로 데이터를
저장하는 공간이지만, heap는 실제 값들이 저장된 공간이고 우리가 함수를 통해 이 실제 저장된 값들을 호출 할 수 있는 공간이다.
*요약 : stack에 저장되는 값들은 일시적인 값들이고, heap에 저장되는 값들은 실제로 존재하는 값이다.
참조 영상 및 블로그
www.youtube.com/watch?v=UcPuWY0wn3w
m.blog.naver.com/heartflow89/220954420688
yaboong.github.io/java/2018/05/26/java-memory-management/
-----------------
이 밑으로는 완전히 이해하지 못해 헷갈리는 부분입니다. 개인적으로 나중에 알아보기 위해 정리해둔 부분이라 틀린 부분 일 수도 있어 참조하지 않는 걸 추천드립니다.
Garbage Collection
------------------
main 메소드가 끝나면 stack 메모리도 pop이 일어나 다시 비어버린다
Garbage Collection은 더 이상 저장된 값이 필요없다고 판단할때 지워버리는 프로그램인데
car라는 항목은 heap안에 생성한 항목이라 stack에서 지워진다고 해서 사라지지 않는다.
그러나 car는 더 이상 호출하는 함수가 없고 필요없는 항목이라 판단되어
Garbage Collection에 의해 사라질 것 같다. 아마두
'웹 프로그래밍 > JAVA(이론 )' 카테고리의 다른 글
Interface의 이해 (JAVA) (0) | 2021.02.27 |
---|---|
Inner class 의 이해 (member,static) (0) | 2021.02.16 |
Is-a 관계 Has-a관계의 이해 (0) | 2021.02.14 |
- Total
- Today
- Yesterday
- producer
- Spring + ELK
- LoadBalancer
- MSA
- 운동일기
- prometheus
- git
- MariaDB
- Feign
- Kafka Connect
- kafka
- Logstash 활용
- 빅-오
- 오늘저녁 삼겹살
- springcloud
- config
- Logstash to ElasticSearch
- UserService
- JWT
- Gateway
- zipkin
- docker
- rabbitmq
- 루틴기록
- github
- elasticSearch
- consumer
- 미래의나에게동기부여
- ACTUATOR
- 운동
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |