LIFO(Last In First Out) 형태로 데이터를 저장하는 구조
주요 동작: push, pop, peek

스택 메모리에서는 함수가 호출될 때마다 스택 프레임이 쌓이고 함수가 사라지면 그에 해당하는 함수의 스택 프레임도 같이 스택 메모리 영역에서 사라지는 구조로 동작을 한다.
stack memory(스택이라는 자료구조를 사용해서 만들어진 메모리 영역) & stack frame
FIFO(First In First Out) 형태로 데이터를 저장하는 구조
주요동작 : enqueue, dequeue, peek

pruducer / consumer architecture
항상 FIFO를 의미하지는 않음
CPU에서 ready queue라고 적혀있어 FIFO로 동작할 것으로 예상하겠지만 그렇지만은 않다.
PriorityQueue(우선순위가 높은게 먼저 빠져나가는 queue도 있다.)
문서에 queue가 나올 때 FIFO로 동작하는 queue인지, 대기열의 구조만 가진 queue인지 상황마다 다르기 때문에 잘 읽어봐야한다.
-스택 메모리 공간을 다 썼을 때 발생
-재귀함수(recursive function)에서 (종료 조건 없이 호출되거나 종료 조건이 잘못 설정되어 호출이 계속 반복) 탈출 못해서 발생
예시코드
public class StackOverflowExample {
public static void main(String[] args) {
recursiveFunction(1);
}
public static void recursiveFunction(int count) {
System.out.println("Count: " + count);
// 종료 조건이 없어서 무한히 자기 자신을 호출함
recursiveFunction(count + 1);
}
}
수정코드(종료 조건 추가)
public class StackOverflowExample {
public static void main(String[] args) {
recursiveFunction(1);
}
public static void recursiveFunction(int count) {
if (count > 10) { // 종료 조건
System.out.println("Recursion ends at count: " + count);
return;
}
System.out.println("Count: " + count);
recursiveFunction(count + 1);
}
}
-Java의 힙(heap)메모리를 다 썼을 때 발생
-큐에 데이터가 계속 쌓이기만 한다면 발생
큐 사이즈를 고정
만약 큐가 다 찼을 때는 어떻게 해야할까?
1. 예외(exception) 던지기
2. 특별한 값(null or false)을 반환
3. 성공할 때까지 영원히 스레드 블락(block) (공간이 생길 때까지 대기) > 스레드 낭비가 발생할 수 있다.
4. 제한된 시간만 블락되고 그래도 안되면 포기 (LinkedBlockingQueue)