프로그래밍 언어/JAVA

[JAVA] 데이터 타입 분류, 메모리 사용 영역

김곰댕 2021. 6. 11. 15:50
728x90

데이터 타입 분류

자바의 데이터 타입에는 크게 기본 타입과 참조 타입으로 분류된다.

기본타입 : 정수, 실수, 문자, 논리 리터럴을 저장하는 타입

참조타입 : 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말함

기본타입으로 선언된 변수와 참조 타입으로 선언도니 변수의 차이점은 저장되는 값이 무엇이냐이다. 기본 타입인 byte, short, int, long, float, double, boolean을 이용해서 선언된 변수는 실제 값을 변수 안에 저장하지만, 참조 타입인 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다. 번지(객체 주소값)를 통해 객체를 참조한다는 뜻에서 참조 타입이라 부른다.


메모리 사용 영역

JVM(자바가상머신)은 OS에서 할당받은 메모리 영역(Runtime Data Area)을 세 영역으로 구분

JVM? 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하게 하는 것이며, JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 가장 중요한 메모리 관리, Garbage collection을 수행한다.

메소드 영역

JVM을 시작할 때 생성

로딩된 클래스 바이트 코드 내용을 분석후 저장

모든 스레드가 공유

힙 영역

JVM을 시작할 때 생성

객체/배열 저장

사용되지 않는 객체는 GC(Garbage Collector)가 자동 제거

JVM 스택

스레드별로 생성

메소드를 호출할 때마다 Frame을 스택에 추가 (push)

메소드를 종료하면 Frame을 제거 (pop)


메모리 사용 영역 실행순서에 따라

1. java MemoryExample - 운영체제로 부터 메모리를 할당받아 MemoryExample 클래스를 실행

2. JVM 구동 - 운영체제로 부터 받은 메모리 영역(Runtime Data Area)가 생성이 되고, 메소드 영역, 힙 영역이 생성됨

3. Memory Example 로딩 - 메소드 영역에 클래스와 관련된 내용이 올라감 ( 코드 자체가 그대로 올라가는 것이 아니고, 코드를 분석해서 분석된 내용이 올라가게 됨)

4. main 스레드 생성 - main스레드(main() 메소드를 생성시키는 코드 흐름)가 생성이 되는 동시에 JVM 스택이 생성됨

5. main() 메소드 호출 - JVM 스택에 main() 메소드를 호출하는 프레임이 하나 생성됨

6. public static void main(String[] args) {

 

 

 

 

   }

main() 메소드의 매개변수가 string타입, string 배열 객체는 힙 영역에 생성됨

7. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

 

 

           }

   }

변수는 프레임 내부에서 생성

8. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

 

           }

   }

9. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

                      int v3 = 20;

           }

   }

10. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

                      int v3 = 20;

                      sum = add(v2, v3);

           }

   }

 

public static int add(int a, int b){

           return a+b;

}

메소드를 호출 했기 때문에 add() 메소드에 해당하는 프레임이 하나 생성되며 변수 a와 b가 저장됨

500

11. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

                      int v3 = 20;

                      sum = add(v2, v3);

           }

   }

 

public static int add(int a, int b){

           return a+b;

}

add 메소드가 다 실행되고 끝나면 add()메소드에 의해 생성된 프레임이 제거되며, sum에는 10과 20을 더한 30이 저장됨. 

12. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

                      int v3 = 20;

                      sum = add(v2, v3);

           }

   }

sum까지 다 계산을 했기 때문에 if가 끝나게 됨. v2와 v3 변수는 if가 끝남으로 인해 메모리에서 제거됨.

13. public static void main(String[] args) {

           int sum = 0;

           if(sum ==0){

                      int v2 = 10;

                      int v3 = 20;

                      sum = add(v2, v3);

           }

           System.out.println(sum);

   }

sum의 값을 출력하고 나서 main()메소드가 끝이 나게됨. 

main메소드가 끝이나면 main에서 선언한 sum 변수도 메모리에서 없어지고, 매개변수인 args도 없어짐.

14. JVM 종료

main이 끝이나면 프로그램이 끝이 나는 것이기 때문에 Runtime Data Area도 사라짐.

728x90