StackOverflowError(스택, 힙 메모리)
이슈 트러블 슈팅
Last updated
이슈 트러블 슈팅
Last updated
Java 메모리 영역 중 스택과 힙 영역
스택
힙 영역에 생성된 Object 타입(String,Integer,ArrayList,...) 타입의 데이터의 참조값(주소라고 생각)이 할당된다.
원시타입의 데이터가 값과 함께 할당된다. - byte, short, int, long, double, float, boolean, char 타입
각 Thread는 자신만의 스택을 가진다 : 스레드 하나가 새롭게 생성되는 순간 해당 스레드를 위한 스택도 함께 생성되며, 각 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없다. (함수를 많이 사용해봐서 익히 알고 있는 내용)
2. 힙
주로 긴 생명주기를 가지는 데이터들이 저장된다.(대부분의 Object는 크기가 크고, 코드블럭에서 공유되는 경우가 많다.)
애플리케이션의 모든 메모리 중 스택에 있는 데이터를 제외한 부분이라고 보면 된다.
모든 Object 타입(Integer,String,ArrayList...)은 힙 영역에 생성된다.
몇 개의 스레드가 존재하든 상관없이 단 하나의 힙 영역만 존재한다.
힙영역에 있는 Object들을 가리키는 레퍼런스 변수가 스택에 올라간다.
ArrayList 자료구조와 재귀함수를 이용할 때 메모리 초과가 났던 이유!
ArrayList를 사용할 경우, 힙영역에 생성되고, 재귀함수를 호출할 경우 스택에 쌓인다. 재귀함수를 호출하면서 조건에 해당하는 경우 ArrayList에 정답을 넣는다.
불필요하게 과도한 재귀함수 호출은 스택을 과도하게 사용하게 되고, 한정적인 스택 영역을 초과해버린다.
매개 변수와 지역 변수는 스택에 할당된다. (참조 유형을 사용하면 객체는 힙 에 있고 스택의 변수는 힙의 해당 객체를 참조한다.) 스택은 일반적으로 주소 공간 의 상단에 있으며, 사용 되면 주소 공간 의 하단 (즉, 0 쪽)으로 향한다.
메모리를 할당하면이 힙은 주소 공간의 상단으로 갈수록 커질 수 있다. 위의 그림처 힙 이 스택과 "충돌" 할 가능성이 있다.
스택 오버플로의 일반적인 원인은 잘못된 재귀 호출 다. 일반적으로 이는 재귀 함수에 올바른 종료 조건이 없어서 자신을 영원히 호출 할 때 발생합또다. 또는 종료 조건이 양호한 경우이를 충족하기 전에 너무 많은 재귀 호출을 요구하여 발생할 수 있다.