본문 바로가기

Common Programming/Java

Java Data 형, Stak, Heap Memory

Java Data 형입니다.

 구분

상세 

프리미티브 

수치, Boolean 

레퍼런스 

Class, Interface, Array, 열거타입 

Data 구분 중 프리미티브에 대한 기본 메모리 Size 및 값 범위는 다음과 같습니다.

 Data 구분

Data 형 

크기 

값범위 

 정수 

 byte 

 1 byte 

 -128 ~ 127

 short

 2 byte

 -32768 ~ 32767

 int 

 4 byte

 -214748348 ~ 214748347

 long

 8 byte

 값범위 큼

 부동 소수점

 float 

 4 byte(변동 가능)

 

 doulbe 

 8 byte(변동 가능) 

 

 Boolean

 boolean 

 1 byte(변동 가능) 

 

 문자형

 char 

 2 byte 

 

프로그램이 실행될 때 메모리는 크게 Code 영역과 Data 영역으로 구분되어 집니다.

Code -> 실행되기 위한 기계어

Data -> Value를 가지고 있으며 크게 전역, Heap, Stack으로 구분되어짐

 종류

 용도 

 Global

 전역 변수로 사용되어 지며 프로그램 종료 시 값이 반환되어짐

 Stack

 함수가 실행되면 할당되며 함수가 종료되면 Memory를 반환함(LIFO 방식)

 Heap

 동적 Memory 영역으로 프로그램을 실행할때 동적으로 Memory를 할당함

Stack은 함수를 호출할 때 사용되어지며 이때 함수에 대한 정보가 Stack에 저장되어 집니다.

(일반적으로 OS단에서 이야기하는 Call Stack)

컴파일 시 Size가 이미 결정되어집니다.

Heap은 프로그램이 기동하는 실행영역에서 할당되어지며 일반적으로 OS에서 제공하는 Virtual Memory Size까지 가능하다.

Runtime 시 Memory를 가변적으로 할당, 해제하게 됩니다.

일반적으로 C언어에서 malloc을 통해 할당하며 반환 시 free를 사용하여 Memory를 반환하게 됩니다.

 

위의 그림과 같이 stack은 위에서 아래로 Data가 할당되고 Heap은 아래서 위로 Data가 할당되어 집니다.

일반적으로 stack은 OS별로 할당할 수 있는 최고 Size가 있기 때문에 해당 Size 안에서 사용하도록 해야합니다.

Linux의 경우 아래와 같이 # ulimit -a를 통해 Stack Size를 확인할 수 있습니다.

(해당 Max Size를 초과하는 경우 Stack Overflow가 발생하게 되어 프로그램이 Down될 수 있습니다.)

 

 

 

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

Java Version 변경  (0) 2014.03.03