본문 바로가기
🌱 Computer Science/OS

[OS] 메모리구조 : 메소드, 힙, 스택

by 카프리썬_ 2020. 1. 15.
728x90

정리

JVM이 메모리를 OS에게 요청하면 OS는 메모리를 할당한다.

이때 받은 메모리를 클래스영역,스택영역,힙영역으로 메모리 구조를 나눌 수 있다.

클래스 영역프로그램이 실행하기 위해 바이트코드를 로드하는 곳으로 class파일을 찾아서 메모리에 로딩한다.

스택 영역지역변수와 매개변수를 저장한다.

지역변수 : 메소드안에서 선언한 변수

매개볏누 : 메소드를 선언할때 아규먼트로 넣는 변수

이 변수들은 선언된 블록안에서 유효하기 때문에

메소드가 호출되면 저장되고, 메소드가 끝나면 스택에 저장되어 있던 변수를 제거한다.

힙영역은 new로 생성된 인스턴스 변수를 저장합니다.

그리고 JVM이 중단되거나 가비지 컬렉터가 실행되기 전까지 영구적으로 저장됩니다.

스택영역에 주소를 저장하고, 힙영역에 주소에 해당하는 실제 값을 저장함

 

클래스영역 스택영역 힙영역
프로그램 실행을 위한 바이트코드저장 지역변수, 매개변수 저장 new로 생성된 인스턴스변수 저장
  메소드 호출할때마다 저장하고,메소드 끝나면 제거됨 메소드 호출이 끝나도 제거되지 않음

 

또한 8개의 타입 이외의 변수로 선언된 레퍼런스 변수들은 자주 호출되어 사용하기 때문에 스택영역에 주소를 저장하고, 힙영역에 실제 변수의 값을 저장합니다.

 

 

 

 

프로그램이 실행되기 위해 필요한 메모리가 일반적으로 메인메모리

메인 메모리를 관리하는게 OS,

JVM이 메모리가 부족하다고 하면 ,

OS는 JVM한테 필요한만큼 할당

이때 JVM은 OS로부터 받은 메모리는 Runtime Data Area

JVM은 이 영역을 용도에 맞게 5개로 쪼개서 관리

1. 메소드영역

클래스 파일의 바이트 코드가 로드되는곳

JVM이 실행하려면 먼저 그 바이트코드들이 메모리 공간에 저장되어야 함

JVM은 메인 메소드를 호출하는것으로 시작을 함

이때부터 프로그램이 시작되는것

메인 메소드에서 사용하는 클래스와 static 변수가 있는데 그것들이 메소드 영역으로

즉, 프로그램의 흐름을 구성하는 바이트 코드가 로드되는 곳

이렇게 메소드 영역에 바이트 코드가 올라가는것 : 클래스로딩

*클래스 로딩이 이뤄지는 이유?

메소드가 호출되려면 그 메소드를 가지고 있는 클래스 파일이 메모리에 로딩되어야함

그래서 클래스를 실행할때 *.class를 찾아서 메모리에 로딩

2. 스택영역

지역변수와 매개변수가 저장

*지역변수 vs 매개변수

지역변수: 로컬변수, 매소드 안에서 선언한 변수

매개변수 : 파라미터변수, 메소드를 선언할때 아규먼트 안에 넣는 변수

공통점 - 선언된 블록 안에서만 유효함 --> 그래서 스택에 저장한다

스택영역에는 프로그램의 실행과정에서 임시로 할당되는 곳

그래서 그게 끝나면 소멸되는 것들이 저장되는 곳

즉, 메소드가 호출될때 마다 지역변수를 스택에 저장하고,

메소드호출이 끝나면 메소드를 위해 준비했던 변수들이 스택에서 제거된다.

스택영역의 지역변수는 메소드가 호출이 되고 끝나는 프로그램의 실행흐름에 관여

3. 힙영역

new명령으로 생성된 인스턴스 변수가 저장

스택영역과 다르게 메소드 호출이 끝나고 소멸되지 않는다

언제까지 저장?

주소를 잃어버려서 가비지가 되어 가비지 컬렉터에 의해 지워질때까지

아니면 JVM이 종료될때까지

*인스턴스의 소멸방법과 시점은 지역변수와 다르다

레퍼런스변수 : 원시타입(int,long,float,double,char,boolean,byte)을 제외한 타입으로 선언된 변수, 참조변수

얘네는 어디에 저장하지?

스택? 계속 부르면서 쓸텐데 그럼 사용할땐 넣고, 안쓸땐 삭제해서 비효율적

힙? 계속저장하지만 자주 불러야하는데?

그래서 힙영역에 진짜 내용을 저장하고, 스택메모리에는 간단하게 그 주소만 저장하는거

어차피 계속 쓰는 변수니까 스택에서 주소를 찾고, 힙에서 그 주소에 맞는 데이터를 사용

그래서 정리하면

힙영역의 인스턴스들은 지역변수가 참조하고 있는 실제값을 가지고 있다.

변수별로 정리하면

지역변수,매개변수 : 스택영역

인스턴스변수 : 힙영역

참조변수 : 스택영역+힙영역

 

 

반응형