카테고리 없음
[자바] - 힙, 스택, static 영역
sunNprize
2022. 1. 27. 10:57
1월 27일 힙, 메모리, 스택 브리핑
복습: No
작성일시: 2022년 1월 27일 오전 9:37
스택 메모리란?
- STACK
- 위에서부터 아래로 쌓아가는 스택..
- 함수 호출시 생성되는 지역변수 | 매개변수가 저장됨, 함수 호출이 완료되면 사라집니다...
- LIFO(후입 선출)
- 스택메모리에는 실행중인 모든 메서드에 대해 새로운 메모리 블록이 할당됩니다
- 스택메모리의 크기는 고정되어 있고, 일단 생성되면 증가나 축소 불가
- 해당 메모리에 대한 엑세스는 힙 메모리에 비해 빠르다
- 스레드도 stack 영역에 생성, 1개의 스레드는 별개의 T Memory(stack,static, heap)을 갖게 됩니다 이로 인해 하나의 스레드는 다른 스레드로 접근이 불가능하지만, static과 heap은 공유가 가능합니다
- StackOverFlowError 발생이유
- 스택 메모리는 고정되어 있으며 한번 생성되면 확대나 축소 불가능!
- 스택 메모리를 모두 사용한다면 앞으로의 메서드 호출 불가능하기에 StackOverFlowError 발생
- 메서드를 재귀적으로 호출하는데 그 호출에 끝이 없는 경우 실행할 메서드가 계속해서 쌓이게 되면서 StackOverFlow 에러가 발생하기도 합니다
- 스택 메모리를 모두 사용한다면 앞으로의 메서드 호출 불가능하기에 StackOverFlowError 발생
- 해결방안?
- 컴파일러 옵션에서 stack 영역의 크기 증대
- 함수에서 사용하는 지역변수의 크기 축소
- 지역 변수를 전역변수로 바꾸기
- 스택 메모리는 고정되어 있으며 한번 생성되면 확대나 축소 불가능!
- STACK
힙 메모리란?
- HEAP
- 쌓아올린 더미!
- 생성된 인스턴스(객체)들이 올라갑니다
- 공간이 동적으로 할당되고 해제!
- JVM이 어플리케이션을 실행할 때까지 메모리를 할당하고 시작할 때 생성합니다
- 힙 공간에 생성된 객체는 응용프로그램의 모든 위치에서 액세스가 가능합니다
- 가바지 컬렉터에 의해 참조가 없는 객체는 제거하면서 메모리 정리 작업이 수행됩니다
- FIFO (선입 선출)
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당 (위 > 아래)
- OutOfMemoryError 발생
- 힙 메모리 부족으로 발생합니다
- 해결방안
- JVM 설정으로 최소 최대 메모리 할당을 증가
- HEAP
static 메모리?
- Static
- 정적 메모리
- 컴파일 시간 동안 할당된 메모리며
- 고정된 공간을 가지고 런타임 중에 변경 할 수 없는 메모리
- 정적 메로리는 공유되는 자원으로 퍼포먼스의 저하를 가지고 올 수 있습니다.
- Static
메모리의 구조
힙과 스택의 비교
힙과 스택에서 메모리가 차는 방향!