[Java] 메모리(Static, Stack, Heap)

박연주·2023년 5월 18일
0

Java

목록 보기
17/17

  • java.exe로 JVM이 시작되면 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 다음과 같이 세부 영역으로 구분해서 사용
    → 스태틱 영역 : 클래스와 static 친구들
    → 스택 영역 : 메서드들
    → 힙 영역 : 객체(Instance)들

Method Area (Static 영역) - 정적 메모리

  • 클래스들을 클래스로더로 읽어 클래스별로 분류해서 저장
  • JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역
  • 프로그램이 종료될 때까지 지워지지 않을 데이터 저장
  • 대표적으로 전역 변수와 static 변수
  • 상수도 저장

JVM 스택 영역

  • 각 스레드마다 하나씩 존재하며 스레드가 시작될때 할당됨
  • 메소드를 호출하면 프레임 추가(push), 메소드가 종료되면 프레임 제거(pop) 수행(지역변수, 메소드 등이 할당)
  • 메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장
  • 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제
  • LIFO(Last In First Out)의 구조

Heap 영역

  • 참조 자료형의 객체와 배열이 생성되는 영역
  • 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조
  • 스택보다 큰 메모리를 할당받기 위해 사용
  • 동적 메모리 할당 ( new /포인터)
  • 스택보다 느림

Garbage Collector

  • GC는 힙 영역에서 사용하지 않는 객체들을 제거하는 작업(객체를 제거하는 작업이 필요한 이유는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문)
  • GC 수행시 시스템이 멈추기 때문에 의도치 않은 장애의 원인이 될 수 있습니다. 따라서 이를 위해 힙 영역을 조정하는 것을 GC 튜닝이라고 하고 JVM 메모리는 절대 마음대로 조정해선 안됩니다.

public class StackAndHeap {
	public static void main(String[] args) {
    	int a = 5;        // stack 영역에 데이터가 저장됨
        int[] b = null;   // int형 배열 선언 및 Stack 영역 공간 할당
        System.out.pringln(b);    // 결과 : null
        a = new int[5];   // Heap 영역에 5개의 연속된 공간 할당 및 
        				  // 변수 a에 참조값 할당
		System.out.println(a);  // 결과 : @15db9742 (참조값)
        
 
// 실제 데이터를 갖고 있는 heap 영역의 참조 값을 stack 영역의 객체가 갖고있음
// 이렇게 리턴 받은 참조값을 가지고 있는 객체를 통해서만 인스턴스 핸들 가능







Reference

https://helloworld-japan.tistory.com/33
https://m.blog.naver.com/heartflow89/220954420688

profile
하루에 한 개념씩

0개의 댓글