메모리 구조

Park Jae Hong·2022년 7월 21일
0

JVM 이란 ?

C/C++ 의 경우에는 컴파일 플랫폼과 타켓 플랫폼이 다를 경우 동작 되지 않는다.
ex) Linux에서 컴파일해서 나온 실행 파일을 windows 에서 실행 시키면 동작하지 않는다.
이를 해결하기 위해 크로스 컴파일라는 것이 있는데 이는 타켓 플랫폼에 맞춰 컴파일 한다.
JVM의 경우에는 java 코드를 javac라는 컴파일러를 통해 java byte code가 되는데 이는 JVM이 설치된 어떠한 환경에서도 동작한다.
(그래서 Java or JavaScript 가 웹브라우저에 만들때 사용되는거 같다.)


Stack

  • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.

  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

  • 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.

Heap

  • 런타임에 크기가 결정되는 메모리 영역이다.

  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

  • 참조형의 데이터의 값이 저장된다. (EX - 클래스, 클로저가 이 부분에 해당 된다.)

  • Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

  • HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다.

  • 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭합니다.


❗ 그림으로 이해하기

stack

1. 메인 함수에서 변수를 선언하게 되면 변수명과 값이 Stack 영역에 저장한다.

2. 함수를 호출하게 되면 함수에 있는 변수와 값들이 Stack 영역에 저장한다.

3. 함수 호출이 종료되면 Stack 영역에 들어있던 값을이 살아지고 결과값을 Stack 에 저장한다.


Heap

1. String 변수는 Object를 상속 받기 때문에 변수 명만 Stack 에 저장되고 값은 Heap 영역에 저장된다.

2. 아래 처럼 값의 변경이 있을 경우 Heap 영역에 값을 변경된 값으로 다시 저장하고 기존 Heap 영역에 저장되어 있던 값은 Stack 과 분리 된다.

3. 분리 된 값으로 인해 Heap 영역에 데이터 누수가 발생하므로 Garbage Collection 으로 데이터 누수(단편화)를 막는다.

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글