Java

[JAVA] 메모리 관리 (스택, 힙)

simba 2021. 3. 4. 16:38

- Java에서 메모리관리를 하는 방법에 관해

- Stack과 Heap이란

 

 

Java는 OS의 메모리 영역에 직접적으로 접근하지 않고 JVM(Java Virtual Machine)을 이용하여 간접적으로 접근한다. 

프로그램 실행시 JVM 옵션을 주어서 OS에 요청한 사이즈 만큼의 메모리를 할당받아 실행하게 되는데, 

할당받은 메모리 이상을 사용하게 되면 에러가 나게 된다. 

 

GC(Garbage Collection)는 백그라운드에서 사용되지 않는 객체를 정리하고 메모리를 확보한다.

JAVA에서 메모리가 실제로 어떻게 동작하는지를 알아야 높은 성능과 최적화된 애플리케이션을 만들 수 있고, 문제가 발생해도

빠르게 메모리 누수를 찾을 수 있다.

 

 

Image from ' https://dzone.com/articles/java-memory-management '

 

 

Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • 지역변수들은 scope 에 따른 visibility 를 가진다.
  • 각 Thread 는 자신만의 stack 을 가진다.
Stack은 Heap 객체의 참조 실제 값 자체를 갖는 데이터 (Java 기본형 byte, short, int, long, double, float, boolean, char)를 저장
Java의 Stack 메모리는 스레드당 할당. 스레드가 생성되고 시작될때 스레드는 자신의 Stack 메모리를 갖고 , 다른 스레드 Stack 메모리에 접근 할 수 없다.

 

Heep

  • Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다. (대부분의 오브젝트는 크기가 크고, 서로 다른 코드블럭에서 공유되는 경우가 많다)
  • 애플리케이션의 모든 메모리 중 stack 에 있는 데이터를 제외한 부분이라고 보면 된다.
  • 모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.
  • 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.
  • Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.
Heap은 메모레의 실제 객체를 저장한다. Heap 영역은 주로 긴 생명주기를 갖는 데이터들이 저장된다.
모든 Object 타입(Integer, String, ArrayList, HashMap) 등이 Heap 영역에 생성된다,
Heap 영역에 있는 Object들을 가리키는 레퍼런스 변수가 Stack 에 저장된다.

 

 

참조 - yaboong.github.io/java/2018/05/26/java-memory-management/