메모리

Dec 13, 2023
메모리

자바가 JVM을 실행
notion image
 
notion image
.class 파일(바이트 코드)을 들고 옴
.class 파일은 네이티브 파일이 아님
 
💡
바이트 코드 : JVM이 이해
네이티브 코드 : OS가 이해
💡
로딩 : HD에 있는 데이터를 메모리에 올리는 것
💡
작성한 코드를 저장하면 컴파일 되고 HD에 저장이 됨
notion image
 
실행할 때 CPU가 관여함(메모리에 데이터가 있어야 함)
 
notion image
 
💡
프로세스 : 프로그램이 실행
프로그램이 실행되면 메모리에 할당됨
실행하는 것이 많을수록 메모리를 많이 사용함
💡
데몬 : 끝이 없는 것
 
💡
.class 파일을 들고 와서 실행할때
파일 분석을 먼저함
  1. static을 찾음
  1. main을 찾아 실행
 

메모리를 효율적으로 사용 → 관리하는 방법

메모리 : 저장 영역, 영역에 대한 주소(번지)가 있음

Static : 시작전부터 메모리에 띄움


package ex04; /** * JVM이 시작할때 * 1. static 찾음 -> age, main * 2. main 찾아서 실행 */ class Person1{ static int age = 20; char gender = '여'; // 원시 자료형(primitive data type) // 커스텀 자료형(내가 만든 자료형) } public class MemEx01 { public static void main(String[] args) { System.out.println(Person1.age); } }
notion image
💡
특징 : 정적 할당
main이 실행되기 전에 메모리에 뜸
생명주기가 가장 긺
클래스명.변수명 : static 공간은 어디서나 찾을 수 있음
클래스에 있으면 클래스명을 생략 가능함
메모리를 많이 사용함

Heap : 동적으로 원할 때 띄움


package ex04; class Person2{ int age = 10; char gender = '남'; } public class MemEx02 { public static void main(String[] args) { System.out.println("1년 지남"); System.out.println("2년 지남"); System.out.println("3년 지남"); Person2 p2 = new Person2(); // 타입명 + 변수 = new 클래스명; System.out.println(p2.age); System.out.println(p2.gender); System.out.println("메인 종료"); } }
notion image
notion image
액세스 :
특징 : 동적 할당
내가 원할 때 메모리에 띄움
static 보다 생명주기가 짧음
 
heap 찾는 방법
여러번 띄울 수 있음 > 가르키는 변수가 필요함
타입명 + 변수 = new 클래스명(); // 클래스 안에 있는 내용을 메모리에 띄움

Stack : 메서드가 실행될 때 띄움


package ex04; public class ScopeEx01 { int n1 = 1; static int n2 =2; static void m1(){ int n1 = 10; System.out.println("m1 : " + n1); // n1 = 10 } void m2(){ System.out.println("m2 : " + n1); // n1 = 1 } //main 시작전에 static에 n2 변수와 n1 메서드 이름만 로드되어 있음 public static void main(String[] args) { System.out.println("1"); m1(); System.out.println("2"); } }
 
💡
Stack : 임시 저장을 위해 만들어짐
Queue : 순서대로 코드를 실행하기 위해 만들어짐
(데이터 저장x)
Scope : 해당 변수의 사용 범위
 
💡
서로의 stack에 접근이 안됨
잠깐 떴다 사라지니까 외부에서 찾을 수 없음
return으로 전달 받아야 함/main 변수가 됨
 
💡
생명주기 : static < heap< statick
💡
1. 클래스 로드(메모리에 클래스가 뜸)
  1. static 찾기
클래스 별로 영역이 나뉨
원래는 프로젝트 안에 있는 모든 static이 뜸
  1. main을 찾아 실행
main의 근거
static : 실행전에 메모리에 떠 있음
public : 외부에 있는 JVM이 접근 가능
  1. main메서드가 열리면 main Queue가 실행
put : 라인들이 담김
pop : 끝나서 메모리에서 CPU로 가서 모니터에 출력됨
notion image
💡
저장되는 공간이 다름
 
package ex04; public class ScopeEx01 { int n1 = 1; static int n2 =2; static void m1(){ int n1 = 10; System.out.println("m1 : " + n1); // n1 = 10 } void m2(){ System.out.println("m2 : " + n1); // n1 = 1 } //main 시작전에 static에 n2 변수와 n1 메서드 이름만 로드되어 있음 public static void main(String[] args) { System.out.println("1"); m1(); System.out.println("2"); ScopeEx01 sc = new ScopeEx01(); sc.m2(); } }
notion image
 
메서드 내부의 변수 : 지역변수 / 생명주기가 가장 짧음
메서드는 이름만 뜸
참조변수 : 주소를 가지고 있음 / *를 붙임
heap이랑 static은 다 찾을 수 있음

같은 scope에 있는 data 정리


static (n2 =2, m1(), main)
어디에서든지 접근 가능
heap ( n1=1, m2())
static이 안 적힌 모든 것
heap끼리는 같은 scope여서 접근이 가능
메서드의 실행은 heap
stack (n5=10)
메서드의 내부가 저장만 됨
외부 접근 불가능
💡
데이터를 저장하는 것과 찾아 실행하는 위치가 다름
Share article

vosw1