JAVA

JAVA 데이터 타입, 메모리 사용 영역

yoon9 2021. 7. 27. 18:10

데이터타입

자바의 데이터타입은 크게 기본타입참조타입으로 분류 됩니다.

기본타입에는 정수타입(byte, char, short, int, long), 실수타입(float, double), 논리타입(boolean)으로 나누어 집니다.

참조타입에는 배열타입, 열거타입, 클래스타입, 인터페이스타입이 있습니다.

여기에는 클래스타입만 다룹니다.

 

//기본타입변수
int a = 7;
double b = 100.3;

//참조타입변수
String c = "다짜고짜";
String d = new String("다짜고짜");

 

Stack영역에는 기본타입변수와 참조타입변수가 있다고 가정하면,위에 코드와 같이 기본타입변수는 직접 값을 저장하고 있지만, 참조타입의변수는 Heap영역의 String객체의 주소의 값을 가지고 있습니다.

여기서 이렇게 기본타입변수와 참조타입변수의 차이를 알 수 있습니다.

 

 

 

String a = "다짜고짜";
String b = "다짜고짜";

String c = new String("다짜고짜");

위에 코드와 같이 변수 a,b와는 같은 힙영역을 가르키지만, 변수 c는 new연산자를 이용하여 객체를 생성을 하였으므로 주소값이 다른 힙영역을 가르킵니다.

 

그리고 또한 값을 비교하는 연산자인 ==와 !=연산을 기본타입의변수와 다른점은 기본타입의변수는 그 해당값을 직접 가지고 있지만, 참조변수는 직접가지고 있지않고 그 해당 힙영역의 객체의 주소를 가지고 있다. 그래서 참조변수의대해 비교 연산자는 주소값을 비교하는것을 된다. 참조변수의 주소값을 비교하는것이 아닌 값을 비교하고 싶으면 equals()을 사용하면된다.

 

equals의 사용 예.

String a = "너무덥다";
String b = "너무춥다";
String c = "너무덥다";

boolean result = a.equals(b);  // false
boolean result1 = a.equals(c); // true
//객체의 주소가 아닌 순수 문자열을 비교한다.

 

메모리 사용 영역

JVM(JavaVirtualMachine)이 사용하는  메모리 영역에 대해서 알아보기로 하겠습니다.

JVM의 메모리 사용영역.

 

JVM은 크게 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area 이렇게 4가지로 구성된다.

 

1. Class Loader

최초로 .java소스를 자바컴파일러가 컴파일을 하면 .class 같은 자바를 클래스파일(바이트코드)로 변환을 시켜줍니다.

Class Loader는 이렇게 바이트코드로 변환된  Class파일들을 모아서 메모리영역인 Runtime Data Area로 적재를 하는 임무를 수행합니다.

 

바이트코드는 고급언어(자바)로 작성된 소스코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 뜻함. 그리고 이 바이트코드를 가상머신이 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일을 합니다.

 

즉 가상머신이 이해 할 수 있게 컴파일러가 바이트코드로 변환을 시켜주고, Class Loader가 이 변환된 Class파일들을 모아서 메모리영역인 Runtime Data Area에 적재를 합니다.

 

 

2. Execution Engine

Execution Engine은 Class Loader에 의해 메모리에 적재된 클래스(바이트코드)들을 기계어로 변경해 명령어 단위(operation Code)로 실행하는 것을 뜻합니다.

명령어단위 실행에는 2가지 방식이 있다.

 

인터프리터 방식 : 명령어를 하나씩 수행(기본적인 방식. 전체 수행은 느리나 명령어 하나씩의 동작은 빠름)


JIT(Just In Time compiler)방식 : 전체 바이트 코드를 네이티브 코드로 변환하고 그 이후에는 인터프리팅하지 않고 네이티브 코드 상태로 실행(전체적인 동작은 빠르나 컴파일하는데 상당 시간 소요)

 

 

3. GarbageCollector

LISP 라는 언어에서 처음 도입된 개념이다(정처기 공부하면서 본 언어..). 하지만, 자바가 가비지 컬렉션이란 개념을 더욱 대중화를 시켰다고 볼 수 있습니다.

가비지 컬렉터란 Heap영역에 생성된 객체가 존재하고 있을 경우에 참조되지 않고 있는 객체들을 제거하는 역할을 해줍니다.

즉 스택영역에 참조타입변수가 존재하는데 힙영역의 객체를 참조하지않거나 null로 되어 있을 경우 가비지 컬렉터가 정리를 해줍니다.

그런데 여기서 가비지 컬렉터는 언제 객체를 정리하는지 알 수가 없습니다. 즉 힙영역에 객체를 참조하고 있지않다고 바로 가비지 컬렉터가 메모리를 정리하는게 아니라는 것 입니다.

추가로 가바지컬렉터가 일을 할때는 가비지컬렉터의 스레드를 제외한 모든 스레드들이 일시정지상태가 된다는 것만 알고 있자.

 

 

4. Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션 실행시 사용되는 데이터를 적재하는 영역입니다. 즉 데이터가 모여있는 공간이라고 생각하면 됩니다.

 

크게 5가지로 분류가 됩니다. Method Area, Stack Area, Heap Area, Pc Register, Native Method Stack 

 

1. Method Area(모든 스레드가 공유하는영역.)

필드 정보(클래스 멤버 변수명, 데이터 타입, 접근제어자 정보등등..)

메소드 정보(메소드 변수명,리턴 타입, 접근제어자 정보)

전역변수, 클래스변수가 저장되는 공간.

타입의 정보 (Interface인지 class인지)

상수풀.

 

프로그램시작부터 종료될 때까지 메모리에 남습니다.

 

 

2. Stack Area

지역변수, 파라미터, 리턴값 ,연사넹 사용되는 임시값 등을 저장을 합니다(메소드에 사용되는 값들이 저장되는 공간이라고 이해하면 편하다. Method Area보다 작은 개념..?) ,

임시값이라는 표현을 하듯이 Method Area와 차이점이 메소드 호출시 마다 스택이 PUSH하고 메소드가 실행이 끝나면, POP을 하며 사라진다.

 

 

3. Heap Area(모든 스레드가 공유하는영역.)

new 연산자를 이용하여 생선된 객체와 배열이 생성되는 영역입니다.(인스턴스 생성)

즉 참조타입을 갖는 객체들은 이 HeapArea에 저장됩니다.

이영역은 추가로 가비지 컬렉터가 회수하기 전까지 메모리에 유지됩니다.

 

 

 

4. Pc Register

PC Registers는 Thread가 생성될 때 마다 생기는 공간으로 Thread가 어떠한 명령을 실행하게 될지에 대한 부분을 기록을 한다.

JVM은 Stacks-Base 방식으로 작동 하는데, JVM은 CPU에 직접 Instruction을 수행하지 않고, Stack에서 Operand를 뽑아내 이를 별도의 메모리 공간에 저장하는 방식을 취하는데, 이러한 메모리 공간을 PC Registers라고 한다.

 

 

5. Native Method Stack

자바언어를 제외한 언어로 작성된 네이티브 코드를 위한 메모리영역입니다.

보통은 c나 c++등의 코드를 수행하기 위한 스택이라고 합니다.(JNI)

 

 

 

 

 

 

 

 

 

 

Reference

 

https://velog.io/@hono2030/JVM%EC%9D%98-%EA%B5%AC%EC%A1%B0

 

JVM의 구조

JVM의 구조

velog.io

https://www.hanbit.co.kr/store/education/edu_view.html?p_code=C5815590736