-
메모리와 스택과 힙개발/java 2021. 12. 14. 23:11
개발을 할때 변수는 어디에 저장되고 데이터튼 어디에 쌓이고 갑자기 인텔리제이 빌드는 힙 메모리가 부족하다고 안되고 .. 등 원인에 대해 알지 못하고 그냥 막 사용 하였습니다.
이에 대해 조금 알아보고자 합니다.
메모리란
단기 데이터 스토리지 정보에 빠르게 액세스 할 수 있도록 컴퓨터가 실시간으로 사용하는 정보입니다.
주로 애플리케이션 로딩, 인터넷 브라우징 , 등 일상적인 여러 작업을 수행하는데 사용합니다.
그래서 용량이 큰것이 더 나은 성능을 좌우합니다.
만약 제가 만든 프로그램이 실행이 되면 OS가 JVM에게 메모리를 할당해줍니다.
그리고 할당 받은 메모리는 사용 용도에 따라 영역을 나누어 관리가 됩니다.
이는 크게 코드영역 , 데이터 영역 , 스택 영역 , 힙영역 이렇게 4개로 분리가 됩니다.
코드영역
실행할 프로그램 코드가 저장되는 영역으로 텍스트 영역으로 불립니다. 이걸 CPU가 하나씩 처리를 하는 것 입니다.
메서드 영역
코드에서 사용되는 클래스 파일을 클래스 로더로 읽어 필드 데이터 , 메서드 데이터 , 메서드 코드 ,생성자 코드 등으로 분류되서 저장됩니다.프로그램 시작과 함께 할당되며 프로그램이 종료되면 소멸합니다.
전역 변수와 정적 멤버 변수(static)도 이 영역에 저장되므로 프로그램이 종료 될 때 까지 어디서든 사용 할 수 있습니다.
스택(stack) 영역
함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역 입니다.
함수가 호출될 때 할당 되며 함수의 호출이 완료되면 소멸합니다.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라고 합니다.
스택 영역에 저장되는 변수에는 기본자료형 과 참조 자료형이 있습니다.
기본 자료형의 경우 데이터 자체가 스택에 저장됩니다.
참조 자료형의 경우 실제 데이터의 주소값만 스택에 저장하며 실제 참조 자료형 데이터는 heap 영역에 존재합니다.
힙(heap)영역
new로 생생된 객체와 배열이 저장되는 영역 입니다.
생성에 필요한 인스턴스와 배열의 메타 정보는 Heap 내의 Method Area에서 얻어옵니다.
가비지 컬렉션의 대상이 되는 영역으로 개발자가 객체러르 제거하기 위해 별도의 코드를 작성할 필요가 없습니다.
힙은 크게 Permanent Generation , New/Young , Old 3가지의 영역으로 나뉘어져 있습니다.
1)Permanent Generation (메타데이터 저장영역)
:Class ,Method의 메타 정보 , static 변수와 상수 정보들이 저장되는 공간입니다.
2)New/Young
: -Eden : 객체가 최초로 Heap에 할당되는 장소입니다. 이 영역이 가득 차면 Survivor 영역으로 살아있는 객체를 넘깁니다.
-Survivor 0/1 : Eden에서 살아남은 객체가 잠시 머무르는 곳입니다.
3)Old
:Survivor영역에서 살아남아 오랫동안 참조 되고 앞으로 사용될 확률이 높은 Object들을 저장하는 영역입니다.
가비지 컬렉터는 힙 내 객체 중에서 가비지를 찾아내고 찾아낸 가비지를 처리하여 힙 메모리를 회수 하는 역할을 합니다.
'개발 > java' 카테고리의 다른 글
Iterate는 멀까 (0) 2021.12.18 enum 활용법 (0) 2021.12.15 Builder 패턴 (1) 2021.12.14 일급 컬렉션 (0) 2021.12.12 enum (0) 2021.12.12