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

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

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