PostIT

[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리 본문

Java

[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리

shun10114 2017. 5. 31. 11:05

[Java/Stack/Heap] JAVA의 Stack과 Heap의 이해를 통해 Java의 메모리 관리


- 최근 수정일 : 2017.05.31



## 1. 배경.

  • C언어를 하시던 선임께서 Python의 Stack과 Heap의 메모리 할당을 정확히 모르겠다는 얘기를 들으면서 정작 이와 관련한 Java에 대한 필수 정보가 부족하다는 사실을 알게되면서 조사를 시작했다.

  • Software는 Hardware와 결국 관련이 깊을 수 박에 없다. 그리고 현재까지 컴퓨터는 무어의 법칙에 의거하여 하나의 CPU 속도가 빨라지는 것이 아니라, 컴퓨터에 들어가는 코어의 개수를 늘려 속도가 빨라지게 하였으나 한계를 맞이하고 있다. 

  • 이를 해결하기 위해 최근에 읽은 '7가지 동시성 모델'이란 책의 저자는 멀티 코어의 위기를 벗어나기 위한 소프트웨어 동시성 기술이 필요하다고 강조한다. 그리고 동시성(+병렬성)을 갖춘 프로그래밍의 중요성을 강조한다. 이 내용을 확인하면 결국, 컴퓨터의 한정된 자원을 이용하는 소프트웨어는 하드웨어의 메모리 할당 부분에 대해 알지 못하면 안된다는 생각을 갖게 만든다. 이를 위해 조금이나마 찾아보고 정리해보고자 한다.



## 2. 목적
  • Java에서 Stack과 Heap에 메모리 할당부분을 이해하며, 어떠한 차이가 있는지 정리한다.
  • 결국, JAVA는 JVM이라는 가상머신에서 컴파일/실행시키는 것. JVM을 이해하여 자바의 메모리 할당부분 이해를 도운다.
  • JVM의 메모리 할당은 결국, Java Garbage Collection을 통해 메모리를 관리한다. Java의 GC에 대한 이해를 통해 메모리 관리에 대한 부분을 이해한다.


## 3. 내용

코드(code) 영역

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부릅니다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.


데이터(data) 영역
메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.

스택(stack) 영역
메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역입니다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다. 
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

힙(heap) 영역
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역입니다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.



### Stack(정적 메모리 할당)이란?


  • 스택은 같은 타입의 자료를 "하나 다음 하나"라는 컨셉으로 순차적으로 저장하는 직선형 자료 구조이다.
    우리가 스택에서 자료를 추출하고 삽입할 때 우리는 순렬의 끝에만 접근이 가능하다. 새로운 데이터는 스택의 최상위에 위치하게되고, 데이터 추출시, 우리는 오직 가장 최근에 삽입된 데이터만(최상위) 접근이 가
    능하다. 
    이 이유때문에 스택은 보통 "LIFO(Last In First Out)" 구조 라는, 가장 최근에 들어간게 가장 먼져 나온다는 뜻을 가진 어문으로 표현되기도 한다.

  • JVM(Java Virtual Machine)자바 가상 머신

    자바 프로그램이 실행될 때 사용되는 JVM 에서도 스택은 사용된다. 각각의 스레드는 1개의 스택을 가지고 모든 메소드들을 트랙킹한다. 새로운 메소드들이 호출 될 때 마다, 새로운 프레임이 스택에 삽입되고, 메소드가 끝날 때 마다 스택에서 제거된다

  • 기본 타입
    - 정수타입 : byte / char / short / int
    - 실수 타입 : float / double
    - 논리 타입 : boolean

  • 스택 영역은 변수값을 저장하게 되는데 기본타입인 정수형 변수와 실수형 변수와 논리형 변수를 실제값으로 저장한다.
  • 크기가 정해져 있는 타입이다.
  • 메모리 할당시 컴파일할때 이미 계산이 이루어진다.
  • 메소드 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.

  • 장점
    해제하지 않음으로 인한 메모리 누수와 같은 문제를 신경쓰지 않아도 된다. 정적 할당된 메모리는 실행 도중에 해제되지 않고, 프로그램이 종료할 때 알아서 운영 체제가 회수한다.
  • 단점
    메모리의 크기가 하드 코딩되어 있어서 나중에 조절 할 수 없다. 스택에 할당된 메모리이므로 동적 할당에 비해 할당 받을 수 있는 최대 메모리에 제약을 받는다.



### Heap(동적 메모리 할당)이란?

  • 동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. 이것은 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 정적 메모리 할당과 대조적이다.

    동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집이 일어나기 전 까지 그대로 유지된다. C/C++와 같이 쓰레기 수집이 없는 언어의 경우, 동적 할당하면 사용자가 해제하기 전까지는 메모리 공간이 계속 유지된다. 동적 할당은 프로세스의 힙영역에서 할당하므로 프로세스가 종료되면 운영 체제에 메모리 리소스가 반납되므로 해제된다. 그러나 프로세스가 계속 실행될 때에는 동적할당 된 영역은 유지되므로 프로그램이 정해진 힙 영역의 크기를 넘는 메모리 할당을 요구하면 할당되지 않는다. 따라서 사용이 완료된 영역은 반납하는 것이 유리한데, 프로그래머가 함수를 사용해서 해제해야 한다. 자바는 더 이상 사용되지 않으면 JVM에서 GC가 메모리를 수거해간다.

  • 참조 타입
    - 배열 타입
    - 열거 타입
    - 클래스(Class)
    - 인터페이스

  • 힙 영역은 객체와 배열이 생성되는 공간이고 참조타입(배열, 열거, 클래스, 인터페이스)들을 힙영역에 주소형식으로 저장한다. 
  • 크기가 정해져 있지 않는 타입이다.
  • 메모리 할당시 프로그램을 실행할때 메모리를 빌려 동적으로 할당한다.
  • 참조하는 변수가 없다면 자동으로 힙 영역에서 제거 된다.

  • 장점
    상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.
  • 단점
    더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다. 자바는 GC가 할당하므로서, 이 단점을 보완하였다.


### Stack과 Heap의 관계


  • 정적으로 할당된 스택의 메모리의 참조 값을 힙에 넘겨 값을 쓸 수 있게 동적으로 만들어 줍니다. 이를 동적 메모리 할당이라고 합니다.
  • 쉬운 예로, 스택에서의 Null값이 Heap에 할당되었을 때 참조할 수 있는 값이 없어 힙을 생성할 수 없다는 NullPointException에러를 볼 수 있습니다.



- JVM과 JGC에 대한 내용은 다음 포스팅에 이어서 나가도록 하겠습니다.


## 4. 참조 


https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2 : JVM이란

https://muckycode.blogspot.kr/2015/01/stack.html : Stack

https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0

http://d2.naver.com/helloworld/1329 : GC란?

http://www.earlyadopter.co.kr/12496 : 무어의 법칙, 19억개의 트랜지스터





Comments