본문 바로가기
Java/Java

[Java]메모리 구조

by 전재경 2022. 11. 11.

프로그램이 구동되기 위해서는 프로그램 구동시 운영체제로부터 메모리(RAM) 공간을 할당 받아야한다.

하지만 메모리는 무제한이 아니라 한정되어 있기에 효율적으로 사용하는 프로그램을 작성해야 하고

프로그램을 잘못 작성하게 되면 프로그램이 느려지거나, 꺼지는 등 문제가 발생할 수 있다.

자바로 만들어진 프로그램은 JVM을 통해 실행되고 이 JVM은 프로그램을 동작할 때 OS로부터 메모리를 할당한다.

 

왜? 프로그램의 메모리를 고려해야할까?

여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자

1) 메모리 설계가 잘 되어 있는 프로그램
2) 그렇지 않은 프로그램

1번 프로그램에 비해 2번 프로그램에서는
속도 저하 현상이나 튕김 현상이 일어날 확률이 크다.

보다 안정적인 프로그램을 개발하려면
메모리 구조를 이해하고 적절하게 사용할 수 있어야 할 것이다.

 

자바의 프로그램 실행 구조

 


JVM 의 전체적인 구조

 

  • Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환한다. (컴퓨터가 이해할 수 있는 코드로 변환)
  • Byte Code로 변환된 파일을 JVM의 Class Loader 로 보낸다.
  • Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할을 한다.
  • Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진이다.
  • Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할을 한다.
  • Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.

 

출처 : https://coding-factory.tistory.com/830

메소드(Method) 영역

  • JVM이 실행되면서 생기는 공간이다.
  • Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
  • Runtime Constant Pool 에는 말 그대로 '상수' 정보가 저장되는 공간이다.
  • 모든 스레드에서 정보가 공유된다.

 

스택(Stack) 영역

  • 지역변수, 메소드의 매개변수와 같이 잠시 사용되고 필요가 없어지는 데이터가 저장되는 공간
  • Last In First Out, 나중에 들어온 데이터가 먼저 나간다
  • 만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
  • 스레드마다 하나씩 존재한다.

 

힙(Heap) 영역

  • new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
  • Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
  • Reference Type 의 데이터가 저장되는 공간
  • 모든 스레드에서 정보가 공유된다.

 

 

 

멀티 스레드에서 메모리는 어떻게 사용되는가 ?

사진 출처 : https://coding-factory.tistory.com/830

 

멀티 스레드에서 메모리 영역을 살펴보자면 메소드 영역과 힙 영역은 모든 스레드가 같이 공유하는데 반해 스택의 경우에는 각 스레드별로 하나씩 생성되어집니다. 이러한 특성으로 각 스레드마다 스택 메모리는 다른 스레드에서 접근이 불가능한 반면에 Method Area와 Heap Area는 모든 스레드에서 접근이 가능하고 프로그램의 시작부터 종료 될 때까지 메모리에 남아 프로그램이 실행되고 있다면 어디서든지 사용이 가능합니다. 이것이 전역변수는 어디서든 접근할 수 있고, Heap 영역의 객체를 주기적으로 삭제해주어야 하는 이유가 됩니다. 

 

 

참고블로그

 

[Java] 메모리 구조 메소드(Method), 스택(Stack), 힙(Heap) 영역에 대하여

자바뿐만이 아니라 모든 프로그램이 구동되기 위해서는 프로그램 구동시에 운영체제로부터 메모리(RAM) 공간을 할당받아야 합니다. 이러한 메모리는 무제한이 아니라 한정되어 있습니다. 그렇

coding-factory.tistory.com

 

 

자바의 메모리 구조

Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자1) 메모

velog.io

 

'Java > Java' 카테고리의 다른 글

[Java]향상된 for문  (0) 2022.11.11
[Java]배열(Array) 선언 및 초기화,복사  (0) 2022.11.11
[Java]기본타입과 참조타입  (0) 2022.11.11
[Java]별 찍기 피라미드  (0) 2022.11.10
[Java]BufferedReader  (0) 2022.11.10

댓글