본문 바로가기

개발/Java

메모리 구조

반응형



메모리 영역별로 저장되는 데이터 유형
위에서 보았던 그림의 각 영역에 대해 구체적으로 살펴 보도록 하자.

1. 코드 영역(Code Area)
코드 영역은 이름 그대로 실행할 프로그램의 코드가 저장되는 메모리공간이다.
따라서, CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행을 한다.

2. 데이터 영역(Data Area)
데이터 영역에는 전역변수와 static으로 선언되는 static 변수가 할당된다.
이 영역에 할당되는 변수들을 프로그램의 시작과 동시에 메모리 공간에 할당되어, 프로그램 종료 시까지 남아있게 된다.

3. 스택영역(Stack Area)
스택 영역에는 지역변수와 매개변수가 할당된다. 이렇듯, 이 영역에 할당되는 변수들은 선언된 함수를 빠져나가면 소멸된다는 특징이 있다.

4. 힙영역(Heap Area)
데이터 영역에 할당되는 변수와 스택 영역에 할당되는 변수들은 생성과 소멸의시점이 이미 결정되어있으나,
프로그램을 구현한다 보면 프로그래머가 원하는 시점에 변수를 할당하고 또 원하는 시점에 해제할 필요가 있다.
바로 이러한 경우에 변수가 할당되는 영역이 힙 영역이다.

RAM 
코드영역
데이터 영역
 - 전역변수 
 - Static변수 
스택
 - 지역변수 
 - 매개변수 
- 프로그래머 할당 


-----------------------------------------------------------------------------------------------------------------------------------------------------

자바는 메소드, 변수를 저장하기 위한 3개의 메모리 공간을 가짐

메소드 영역(Method Area)
 - 메소드 바이트 코드 
 - 클래스 변수 

스택(Stack)
 - 매개변수 
 - 지역변수

힙(Heap)
 - 클래스 객체 
 - 배열 객체 
 - 문자열 객체 

메소드 영역 :  클래스의 메소드에 대한 바이트 코드 또는 클래스의 전역 변수인 클래스 변수 등을 할당하는 메모리 영역 입니다.
 
스택 : 메소드가 실행될 때 매개변수, 메소드 내에 선언된 지역, 임시 변수들이 스택 메소미 영역에 저장됩니다. 메소드 실행이 종료되면 스택 메모리는 시스템에 반환됩니다. 

힙 : 자바에서 객체를 사용할 때 사용하는 중요한 메모리 공간입니다. 힙 메모리를 사용하기위해서는 new연산자를 사용해야 합니다. 즉, 인스턴스를 사용하는 메모리 공간이 바로 힙입니다. 또한, 인스턴스는 new 연산자를 통해서 힙(Heap) 메모리 영역을 사용합니다. 

package BMP2;

public class Songhee {

     public static void main(String[] args) {

          Test t1 = new Test();   // 힙영역 
          t1.test1(3, 4); // 데이터 영역  
     } 
}

class Test {
    
     public void test1(int x, int y) {
          int a;
          int b;
          int c;
          int d;
          int e;          // 스택영역 
          test2();
     }
    
     public void test2() {
          byte a;
          byte b;
          byte c;      // 스택영역
          test3();
     }
    
     public void test3() {
          char a;
          char b;
          char c;
          char d;
     }
}

메모리구성 
코드 영역 : 실행할 프로그램의 코드가 저장, CPU가 여기에서 저장된 명령문들을 하나씩 가져다 실행 
데이터 영역 : 전역변수와 static변수가 할당 프로그램이 종료 시까지 남아 있다. 
스택 영역 : 지역변수와 매개변수 함수를 빠져나가면 소멸
힙 영역 : 코드를 사용하다보면 데이터 영역과 스택 영역의 중간 성격을 지닌 공간이 필요하게 되는데 바로 이부분이다.
             즉, 프로그래머가 원하는 시점에서 변수를 할당하고 소멸하도록 지원하는 영역 

힙 영역을 쓰는 법은 무엇있까요?  -> 바로 메로리의 동적 할당 입니다. 
  - 전역변수와 지역변수로 해결되지 않는 상황
    (두 가지의 정보가 함수를 통해서 반영되어야 하는데 전역변수를 쓰자니 값이 계속 덮어써지고 함수만 쓰자니 함수가 종료되면 그 값 역시 삭제가 된다.) 
  - 이때 사용하는 것이 바로 메모리의 동적 할당
     -> 힙 영역에 메모리를 할당하고 이 공간을 이용하여 매개 변수처럼 사용한다.
     -> 할당된 메모리공간을 받으려면?
     -> 그렇다 바로 주소값을 받을 수 있는 포인터형 변수가 필요하다!

자주 사용하는 malloc과 free함수 
  - #include <stdlib.h>
     void * malloc (size_t size); // 힙 영역으로의 메모리 공간 할당 
     void free(void * ptr); // 힙 영역으로 할당된 메모리 공간 해제 
     -> malloc 함수는 성공시 할당된 메모리의 주소 값, 실패시 NULL을 반환 

  하지만 여기서 알아야 할 것이 있다. 바로 malloc 의 반환형이 void라는 것에 있다. 이말은 

  malloc이라는 함수는 원하는 크기 만큼 메모리 공간을 할당하고 메모리 주소 값을 반환하겠지만 그것을 어떻게 사용할 지는 너가 직접 캐스팅(형변환)을 해서 사용해. 
  라는 것입니다. 


그에 따른 예제는 


#include <studio.h>
#include <studio.h>

int main (void) 
{
     int * ptr = (int *)malloc(sizeof(int));
     int * ptr = (int *)malloc(sizeof(int)*7);
     int i;
     
     *ptr1 = 20;
     for(i=0; i<7; i++)
          ptr2[i]=i+1;

    printf("%d \n", *ptr1);
    for(i=0; i<7; i++)
          printf("%d", pt2[i]);

     free(ptr1);
     free(ptr2);
     return 0;
}

반응형
LIST