욱'S 노트

Stack과 heap의 차이점 본문

JAVA/Pleasure

Stack과 heap의 차이점

devsun 2015. 1. 12. 13:35

자바를 배우기 시작하는 사람이나 다른 언어를 사용하는 사람들에게서 stack과 heap 메모리의 차이를 묻는 것은 일반적이다. Stack과 heap 이라는 두 단어를 누구나 들어봤지만, 명확하게 설명하는 것은 어려운을 흔히 겪는다. 이런 상황은 stack과 heap의 연관관계에 대한 오해에서 비롯된다. 더 혼란스럽게도 stack은 jata.util 패키지에 있는 LIFO순서로 데이터를 저장하는 데이터 구조체이기도 하다.일반적으로 stack과 heap은 메모리의 부분이다. 프로그램은 다른 목적으로 stack과 heap을 사용하며 할당한다. 자바 프로그램은 "java"라는 명으로 실행되는 프로세스의 JVM 상에서 실행된다. 자바 또한 stack과 heap을 다른 목적으로 이용한다.

  

자바에서 stack과 heap의 몇몇 차이점은 다음과 같다.


1) stack과 heap의 주요한 차이는 stack의 지역 변수와 함수 호출시 사용된 변수를 저장하는데 사용되는 반면에 heap은 자바 객체를 저장하기 위해 사용된다. 객체가 코드의 어디에서 생성되는지 중요하지 않다. 즉, 멤버 변수인지 지역 변수인지 클래스 변수인지와 상관없이 항상 자바의 heap 영역에 생성이 된다.


2) 자바는 각 스레드마다 stack 영역을 가지고 있다. (-Xss JVM 파라미터로 지정 가능) 비슷하게 자바 프로그램은 실행된 JVM에 할당된 heap영역을 가지고 있다. ( -Xms -Xmx JVM 파라미터로 지정 가능)


3) 함수 호출이나 지역 변수를 저장하다가 stack에 더 이상 저장할 공간이 없을 경우, JVM은 StackOverFlowError를 발생시키고, 객체를 생성하다가 heap에 더이상 저장할 공간이 없을 경우 OutOfMemoryError를 JVM이 발생시킨다.


4) 재귀를 사용하면 stack 메모리를 빠르게 채울 수 있다. stack과 heap의 또 다른 차이점은 일반적으로 자바에서 stack은 heap보다 용량이 훨씬 작다.


5) stack에 저장된 변수는 자신의 thread 에서만 접근 할 수 있다. 모든 스레드에서 접근을 하고 싶다면 heap에 저장되는 객체를 만들어야 한다. 다시 말하자면 stack은 자바 스레드의 개별적인 메모리이며, heap은 모든 스레드가 공유하는 메모리이다.


여기까지가 자바에서의 stack과 heap의 차이점이다. stack과 heap이 어떻게 동작하는지 알기 전에 어떤 종류의 변수들에 의해 사용되는지에 대한 이해가 중요하다. 


출처: http://javarevisited.blogspot.com

'JAVA > Pleasure' 카테고리의 다른 글

Java - Nashorn  (1) 2016.03.10
Java - Stream  (0) 2016.01.14
Java - Lamda expression  (0) 2016.01.13
NIO란?  (0) 2015.04.17
Comments