Halo World

Java Stack 영역과 Heap 영역 본문

개발 지식/JAVA

Java Stack 영역과 Heap 영역

_Yeony 2021. 1. 2. 17:15

 

[자바 Stack과 Heap 영역]

 

새로운 변수와 객체를 선언하거나, 새로운 메소드를 호출하거나, 문자열 선언 또는 유사한 작업을 수행할 때, JVM은 stack 또는 heap 메모리 영역에 필요한 메모리를 할당한다.

출처 : https://www.baeldung.com/java-stack-heap

 

Stack 메모리 영역

 정적 메모리 할당 및 쓰레드 실행을 위해 사용되는 영역으로 메서드에 고유한 기본 값과 메서드에서 참조하는 힙 개체에 대한 참조 값을 포함하고 있다. LIFO(Last-In-First-Out) 순서로 동작하며, 새 메소드가 호출될 때마다 스택 상단에 해당 메소드에 대한 새 블록이 생성된다. 메서드 실행이 완료되면, 해당 스택에서 pop되고, 호출한 메서드로 흐름이 돌아가게 된다. 

 

특징

  • 스택 내부의 변수는 변수를 생성한 메서드가 실행되는 동안만 존재한다.
  • 메서드 실행에 따라 자동으로 할당되고 해제된다.
  • 해당 메모리 영역이 가득 차면 StackOverFlowError 가 발생한다.
  • 힙 메모리에 비해 액세스 속도가 빠르다.
  • 쓰레드마다 고유의 스택 영역을 가지고 있으므로, Thread-safe 하다.

 

Heap 메모리 영역

 런타임시 Java 객체 밑 JRE 클래스에 대한 동적 메모리 할당에 사용된다. Object가 생성되면 힙 공간에 할당되며, 이 객체에 대한 참조가 스택 메모리에 저장된다. 힙 메모리 영역에 할당된 객체는 해당 응용프로그램 어느곳에서나 접근 가능하고 힙 영역은 다음과 같이 2개의 Generation 영역으로 나뉜다. (Java7에서는 Permanent Generation 영역까지 총 3개였으나 Java8 에서는 해당 영역이 Native 메모리 영역내의 Metaspace 영역으로 바뀌었다. 해당 변경부분에 대해서는 johngrib.github.io/wiki/java8-why-permgen-removed/ 블로그에 잘 설명되어있다.)

Young Generation Young generation 영역은 Eden, Survivor space 0,1로 세분화 된다.
새롭게 생성된 객체 대부분은 Eden 영역에 할당되고, Eden 영역이 가득차면 Minor GC가 발생한다. 이때, Eden 영역이 클리어되면서 참조되지 않는 객체들은 메모리에서 해제되고, 참조되는 객체들은 S0영역으로 이동한다. 기존에 S0에 있던 Reachable Object 들은 S1으로 이동한다. 
Old or Tenured Generation 오래 살아남은 객체들이 저장되는 곳. Young Generation 영역의 Supervivor 영역에 있던 Reachable Object들의 aging이 임계치에 도달하는 경우 Old generation 영역으로 복사된다. 대부분 Young 영역보다 Old 영역이 더 크기 때문에 GC가 더 적게 발생한다. 이 영역이 가득차 GC가 발생할 때 Major GC가 발생한다고 한다.

 

출처 : https://jackyfkc.github.io/cs/language/java/gc.html

 특징

  • 힙 영역이 가득 차면 OutOfMemoryError가 발생
  • 스택 영역에 비해 액세스 속도가 조금 느림
  • 스택 영역과 달리 메모리 해제가 자동으로 되지 않음
  • 메모리 사용의 효율성을 위해 GC가 필요함
  • Thread-safe 하지 않기 때문에 적절히 synchronizing 해야함

 

 

 


 

[출처]

www.baeldung.com/java-stack-heap

code-factory.tistory.com/48

velog.io/@litien/%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0GC

yaboong.github.io/java/2018/06/09/java-garbage-collection/