inblog logo
|
jay0628
    Java

    [Java] 7.1. JVM 사전 지식 (heap, stack, queue)

    김주희's avatar
    김주희
    Feb 07, 2025
    [Java] 7.1. JVM 사전 지식 (heap, stack, queue)
    Contents
    1. heap2. stack3. queue4. 참조 자료형
    ❗
    변수 (int, double, boolean, String)
    static (main이 실행되기 전에 메모리에 로드된다.) - 공간 분리 (전체적인 static 공간 안에 class별로 분리되어 있음)
    static은 정적이고, 한 개만 (한 번만) 메모리에 로드된다.
    메서드(함수) - 4가지 유형(기본, 인수 1개, 인수 여러 개, 리턴이 있는) - void(리턴이 없는)
     
    네이버 블로그 | 배우면 뭐하노 금방 까먹는 금붕어인데네이버 블로그 | 배우면 뭐하노 금방 까먹는 금붕어인데10 [메모리] 클래스 (개념, JVM[ static, stack, queue ] )
    10 [메모리] 클래스 (개념, JVM[ static, stack, queue ] )

    10 [메모리] 클래스 (개념, JVM[ static, stack, queue ] )

    클래스 의 사용 클래스의 모양 (아래 코드와 함께 보이자) - People 이 클래스의 생긴 꼬라지를 함 보이자...

    네이버 블로그 | 배우면 뭐하노 금방 까먹는 금붕어인데네이버 블로그 | 배우면 뭐하노 금방 까먹는 금붕어인데
     

    1. heap

    new 클래스명();

    static이 붙지 않은 변수나 메서드를 main 내부에서 사용하고자 할 때, 메모리에 로드되지 않았기 때문에 단순히 ‘클래스명.변수’와 같은 형태로는 사용이 불가능하다. 이때 new 연산자를 사용한다.
    new는 클래스 타입의 객체를 생성해주는 역할을 한다.
    • new에 의해 static이 붙지 않은 모든(변수, 메서드)것들이 heap에 로드된다.
    • staic과 마찬가지로 class 기준으로 묶여서 뜬다.
    • new 클래스명()에 의해 heap 영역에 데이터들이 저장되고, 이에 접근하기 위해서는 대입 연산자 기준으로 좌변에 클래스 타입의 변수를 지정해줘야 한다.
    package jvm; //static이 없으면 메모리에 안 올라와있음 그냥 HDD에 글자만 기록된 것. class Student { int no; String name; int age; void show() { System.out.println(no); System.out.println(name); System.out.println(age); System.out.println(); } } public class Heap01 { // static int no; public static void main(String[] args) { //우변 = heap에 올라오는 것 //좌변 = 우변을 찾기 위해 지칭 Student s1 = new Student(); // new가 되면, static이 붙지 않은 모든(변수, 메서드)가 heap에 로드된다. //staic과 마찬가지로 class 기준으로 묶여서 뜬다. s1.no = 1; s1.name = "홍길동"; s1.age = 20; /* Student s1 = new Student(); // new가 되면, static이 붙지 않은 모든(변수, 메서드)가 heap에 로드된다. staic과 마찬가지로 class 기준으로 묶여서 뜬다. s1.no = 1; s1.name = "홍길동"; s1.age = 20; Student.show(); // static void show일 경우 원래 이 코드는 실행되어야 하지만 프로그램이 그냥 막은 것. */ s1.show(); // s1과 s2는 heap 내부의 서로 다른 공간에 위치함. Student s2 = new Student(); s2.no = 2; s2.name = "김이름"; s2.age = 26; s2.show(); } }

    2. stack

    • 메서드에 사용되는 필요한 데이터(변수 등)를 저장
    • 메서드의 body 전체를 저장하는 것이 아니다.
    • stack에 저장되는 변수 = 메서드 내부에서 선언한 변수 = 지역변수
    • FILO 구조
    • 생명 주기 : stack < heap < static
    notion image

    stack은 FILO

    package jvm; public class Stack01 { static void m1() { int a = 1; // 함수가 호출되어야 함수의 바디가 실행되기 때문에 a는 main 실행 전 올라와있지x m2(); } static void m2() { int b = 1; //m2에는 코드가 뜨는 것이 아니라 b가 뜬 것임 (코드는 queue에 뜸 } public static void main(String[] args) { //stack은 뭘 저장하고 있는지를 보면 됨 Student s = new Student(); //s의 크기를 당장은 모른다. heap이 아니라 main stack에 System.out.println("15번라인"); m1(); System.out.println("17번라인"); } }
     

    Stack Overflow

    • queue가 삭제가 안되는 즉, stack에 할당된 공간들이 삭제되지 않고 계속해서 쌓여서 정해진 범위를 초과할 때 발생한다.
    package jvm; public class Stack02 { static void m1() { int a = 1; m1(); // 재귀함수 } public static void main(String[] args) { m1(); } } // 오류는 위에서 터져서 밑으로 영향을 줌

    3. queue

    • stack에서 할당된 공간 내부의 코드를 실행한다.
    • FIFO 구조
    • 복귀 시에는 호출한 곳으로 돌아간다.
    notion image
     
    package jvm; public class Queue01 { //queue01이라는 클래스의 static 공간에 m1,m2 static void m1() { int n1 = 1; System.out.println("🚒"); System.out.println("🏍️"); System.out.println("️🚲"); m2(); System.out.println("🚅"); System.out.println("✈️"); } static void m2() { int n2 = 2; System.out.println("🍕"); System.out.println("🍔"); System.out.println("🌭"); System.out.println("🥚"); System.out.println("🧀"); } public static void main(String[] args) { System.out.println("main 시작"); m1(); System.out.println("main 종료"); } }
    notion image
     
    notion image
     
     

    4. 참조 자료형

    ❗
    기본 자료형 - 값이 있다.
    참조 자료형 - 주소가 있고 값이 있다.
    모든 참조 자료형의 크기는 4Byte이다
    package jvm; class Data { int num; } public class Ref01 { public static void main(String[] args) { Data d1 = new Data(); Data d2 = d1; d1.num = 10; d2.num = 20; System.out.println("d1.num = " + d1.num); System.out.println("d2.num = " + d2.num); } }
    notion image
    notion image
    Share article

    jay0628

    RSS·Powered by Inblog