Class를 선언할때 메모리 구조를 살펴보기

하히호호·2024년 4월 3일
0

운영체제 속 메모리 구조

운영체제(OS)에서 자바 프로그램이 실행될때,OS가 JVM에 할당하는 메모리 영역이 있다.

1. 기억장치 (storage Device)

기억 장치에 대해 깊게 알아보는 글이 아니기에
대표적인 기억장치들을 언급하고 나가려고 한다.

0) CPU

기억 장치는 아니다..
중앙처리장치라고 하며 컴퓨터의 두뇌와 같은 장치를 말한다. 데이터의 연산 해석, 처리하는 역할을 맡는다.

1) 보조기억장치(HDD;hard disk drive..)

자료를 저장하는 대용량 기억장치이다.
보조 기억 장치는 전원이 나가도 휘발성으로 사라지지 않고 영구적으로 저장할 수 있는 기억 장치이다.

2) 주기억 장치(RAM or ROM ..)

중앙처리장치인 CPU와 직접적으로 정보를 교환하는 기억장치이다.
전원이이 꺼지면 저장된 데이터가 손실된다.

3) 캐시기억장치

CPU랑 주기억장치 간의 속도 차이를 매우기 위해 사용되는 메모리

4)레지스터

CPU의 처리와 관련해서 일시적으로 데이터를 저장하는 저장 장치이다. CPU 내의 임시 저장 장치이다.


프로그램 실행

참조) https://mundol-colynn.tistory.com/171

/진행 과정/

Java 프로그램이 보조 기억장치에 있다가 실행을 하면 주기억 장치(RAM)로 올라오게 된다. 이를 로드한다라고 말하며 이 과정을 로딩(roding)이다.

로딩이 완료되면 프로그램은 실행중인 상태가 되는데 이를 프로세스라고 한다.
이 프로세스들을 관리하는 장치를 프로세서(CPU)라고 한다.


Java 순서
1) 개발자가 코딩을 하면 .java 파일이 생성된다.
2) .java파일이 자바 컴파일러(javac)에 의해 .class파일(바이트 코드)로 컴파일된다.
3) .class 파일은 JVM의 ClassLoader에 의해 Runtime data Area에 로드된다.
4) Runtime Data Area에 로드된 파일(.class)들은 Execution Engine을 통해 해석된다.
5) 해석된 .class는 Runtime data Area의 각 영역에 배치되어 수행한다.


프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고, 메모리를 목적에 따라 여러 영역으로 나누어 관리한다.

메모리 영역

Runtime data Area

Runtime data Area영역은 크게 5가지로 구분된다.
그 중 Java의 메모리 구조에 가장 많이 언급되는 3(4; 코드영역)가지 영역을 정리하려고 한다.

Heap영역, Stack영역, Static 영역(Method,Data영역(+BSS)), Code 영역

Static 영역(Method / data(+BSS))

[File Size와 관계가 있다.]
JVM이 동작해서 클래스가 로딩될 때 생성되는 영역이다.
즉, main이 끝날때까지 살아있는 메모리 영역이다.
'static'키워드가 붙은 변수나 메서드의 정보를 저장하는 영역이다.

  • 전역 변수 (global)와 정적 변수가 할당된다.
  • 초기화된 데이터가 할당되는 영역이다.
  • BSS(Block Stated Symbol)영역은 초기화가 안된 데이터가 할당되는 영역이다.

Heap 영역

[Runtime 결정]
사용자가 원하는 시점에서 변수를 할당하고 해제할 수 있는 영역이다.
즉, 프로그래머가 할당 혹은 해제하는 메모리 영역이다.
데이터의 크기가 확실하지 않을 경우 사용하며
낮은 주소(0x00000000)에서 높은 주소(0xffffffff)의 방향으로 할당한다.
동적 변수가 할당된다.
Java의 GC(가비지 컬렉터)가 일하는 공간이다.

유일하게 런타임때 크기가 결정된다.

Stack 영역

[컴파일 시간 결정]
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(Stack frame)이라고 한다.
함수의 호출이 완료되면 소멸(해제)된다.
함수 호출시 생성되는 지역변수(local)와 매개변수 (Argument)가 저장되는 영역이다.
CPU에 의해서 관리되고 최적화되어 속도가 매우 빠르다.
컴파일 타임에 크기가 결정된다.
컴파일 타임에 결정되기 댸문에 무한히 할당할 수 없다.(메모리 크기 제한)

Code 영역

컴파일이 완료된 코드(0,1)가 존재하는 영역이다.
컴파일 타임에 결정된다.
CPU가 작업을 수행할 때, code영역의 명령어를 가져가 실행된다.

왜 코드 영역이 런타임이 아닌 컴파일 단계에 결정이 되는 것일까?
프로그램이 실행중에는 코드의 내용이 변하면 안되고 변할 일도 없다.
만약 런타임에 결정된다면 프로그램은 실행중에 메모리를 동적으로 할당해야한다.
이렇게 동적할당을 하면 instruction(명령어들의 집합)을 찾는데 시간이 소요된다.
즉, 메모리에 코드를 통째로 올려 놓는 것이 실행을 더 효율적으로 만든다.

overflow

의미 그대로 넘쳐흐른다는 의미를 가지고 있다.

  • Stack Overflow
    Stack 영역이 정해진 크기를 넘어가면 에러가 발생한다.

  • Heap Overflow
    heap 영역이 정해진 크기를 넘어가 stack 영역을 넘어가면 heap overflow가 발생한다.

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글