메모리 : 데이터와 명령어를 저장하는 공간을 말한다.

프로그래밍시 메모리를 4가지있다.

Stack 영역 - 지역변수, 사용자 정의함수, 잠깐 사용하고 삭제할 데이터 저장공간.

Heap 영역 - 동적할당, 사용자의 의사에 의해 원하는 데이터를 사용자정의에 의해 할당된 메모리에 저장하거나 해제.

              할당시 : malloc, new

              해제시 : free, delete

Data 영역 - 전역변수, 지역변수, static으로 선언되는 변수, 프로그래밍이 종료될 때 까지 지워지지 않을 데이터를 저장할                     공간.

Code 영역 - Text, 코드를 저장할 공간. Editor에서 작성한 명령어들이 여기에 저장된다.

 

stack이 많으면 많을수록 동적할당할 수있는 수가 줄어들고, Heap 영역이 많으면 많을수록 stack 지역변수를 선언 할 수 있는 크기가 줄어든다.

 

<정적할당>

 

정적 메모리 할당은 메모리 할당 방법 중에 하나로, 메모리의 크기가 하드 코딩되어 있기 때문에 프로그램이 실행 될 때 이미 해당 메모리의 크기가 결정되는 것이 특징이다.

사용하는 운영체제에 따라 각 데이터형에 약속된 기억공간의 크기가 있고, 지정된 만큼 프로그램을 실행하는 프로세서에 필요한 자원으로 할당 시켜준다. 이런것을 정적할당이라고 한다. 즉, 프로그램 실행의 시작부분에서 필요한 만큼 미리 기억공간을 할당 받고 시작하는 것을 의미한다.

 

  • 장점: 해제하지 않음으로 인한 메모리 누수와 같은 문제를 신경쓰지 않아도 된다. 정적 할당된 메모리는 실행 도중에 해제되지 않고, 프로그램이 종료할 때 알아서 운영 체제가 회수한다.
  • 단점: 메모리의 크기가 하드 코딩되어 있어서 나중에 조절 할 수 없다. 스택에 할당된 메모리이므로 동적 할당에 비해 할당 받을 수 있는 최대 메모리에 제약을 받는다.

 

 

<동적할당> 

동적 메모리 할당 또는 메모리 동적 할당 컴퓨터 프로그래에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제가 쓸 수 있도록 반납하고 다음에 요구가 오면 재 할당을 받을 수 있다. 이것은 프로그램이 실행하는 순간 프로그램이 사용할 메모리 크기를 고려하여 메모리의 할당이 이루어지는 정적 메모리 할당과 대조적이다.

동적으로 할당된 메모리 공간은 프로그래머가 명시적으로 해제하거나 쓰레기 수집이 일어나기 전 까지 그대로 유지된다. C/C++와 같이 쓰레기 수집이 없는 언어의 경우, 동적 할당하면 사용자가 해제하기 전까지는 메모리 공간이 계속 유지된다. 동적 할당은 프로세스 영역에서 할당하므로 프로세스가 종료되면 운영 체제에 메모리 리소스가 반납되므로 해제된다. 그러나 프로세스가 계속 실행될 때에는 동적할당 된 영역은 유지되므로 프로그램이 정해진 힙 영역의 크기를 넘는 메모리 할당을 요구하면 할당되지 않는다. 따라서 사용이 완료된 영역은 반납하는 것이 유리한데, 프로그래머가 함수를 사용해서 해제해야 한다.

동적 할당은 함수가 종료되거나 변수 영역을 벗어나면 자동으로 공간 해제가 이루어지는 스택을 사용한 자동 변수와 대조적이다. 프로세스의 정적 메모리 할당은 프로세스가 시작할 때 이미 정해진 메모리량으로 한정되어있기 때문에, 프로세스가 시작할 때부터 끝날 때까지 유지되는데 반해, 동적 할당은 프로세스의 실행 과정 중에 필요한 메모리를 운영체제에 요구해 할당받고 해제하는 것이 가능하다.

 

 

  • 장점: 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.
  • 단점: 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.

 

 

 

GC(가비지 콜렉터)란?

자바에서는 메모리를 GC라는 알고리즘을 통하여 관리(automatic memory management)하기 때문에, 개발자가 메모리를 처리하기 위한 로직을 만들 필요가 없고, 절대로 만들어서는 안됩니다.

 

Garbage Collection. 자바에서 쓰레기는 객체입니다. 하나의 객체는 메모리를 점유하고, 필요하지 않으면 메모리에서 해제되어야 합니다. 메모리 점유는 다음과 같이 쉽게 할 수 있습니다.

 

이러한 코드에서 a라는 객체가 만들어져 메모리의 한부분을 점유하게 되고, 특정 메소드 호출한 후 수행이 완료되어 해당 객체가 더이상 필요없는 객체, 쓰레기가 됩니다. 이 쓰레기 객체를 효과적으로 처리하는 작업을 GC라고 합니다.

 

 

GC(가비지 콜렉터)의 원리

GC 작업을 하는 가비지 콜렉터(Garbage Collector)는 다음의 역할을 합니다.

1. 메모리 할당

2. 사용 중인 메모리 인식

3. 사용하지 않는 메모리인식

 

GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면, OutOfMemoryError가 발생하여 WAS가 다운될 수도 있습니다. 행(Hang) 즉, 서버가 요청을 처리 못하고 있는 상태가 됩니다.

 

JVM의 메모리는 크게 클래스 영역, 자바 스택, 힙, 네이티브 메소드 스택의 4개 영역으로 나뉩니다. 가비지 콜렉터에서는 힙 메모리를 다루게 됩니다. 즉 자바콜렉터가 인식하고 할당하는 자바 메모리 영역은 힙 영역인 것입니다.

'자바 > 자바 공부' 카테고리의 다른 글

CGI(PHP, 펄)  (0) 2020.05.19
웹서버(NGINX, APACHE)  (0) 2020.05.19
부동소수점과 그 한계  (0) 2020.05.13
메모리 영역  (0) 2020.05.13
컴파일과 컴파일러  (0) 2020.05.13

+ Recent posts