티스토리 뷰

JAVA 프로그래밍을 한다면 JAVA에서 어떻게 메모리 동작하고 관리가 이루어지고 있는지 알 필요가 있다. JAVA는 백그라운드에서 자동으로 메모리 관리 기능을 제공한다. GC(Garbage Collection)는 백그라운드에서 사용되지 않는 객체를 정리하고 메모리를 확보한다.

따라서, JAVA 프로그래머는 사용하지 않는 객체를 파기하는 등의 문제로 신경 쓰지 않아도 된다. 그러나 이런 프로세스가 JAVA에서 자동으로 진행되는 경우에 그 행위는 보증되지 않는다. 그러므로 JAVA에서 메모리가 실제로 어떻게 동작하는지 아는 것이 중요하다. OutOfMemoryError가 나타나기 전에 높은 성능과 최적화된 애플리케이션을 작성할 수 있고, 문제가 발생하면 빠르게 메모리 누수를 찾을 수 있다.

먼저 JAVA에서 메모리의 일반적인 구성을 살펴보자.

일반적으로 메모리는 크게 Stack과 Heap 2가지 영역으로 나눠진다. 위의 그림은 Stack과 Heap의 예시로써 실제 Heap은 Stack에 비해 굉장히 큰 메모리이다.

 

Stack


Stack은 Heap 객체의 참조 실제 값 자체를 갖는 데이터(JAVA 기본형 byte, short, int, long, double, float, boolean, char)를 저장한다. 추가적으로 Stack은 scope 범위에서는 visibility 하다. 즉, 해당 객체는 scope 범위에서만 사용된다는 뜻이다. 전역 변수가 아닌 지역변수가 어떤 함수 내에서 stack에 할당되면 다른 함수에서는 접근할 수 없다.

JAVA의 Stack 메모리는 스레드당 할당된다. 스레드가 생성되고 시작될 때 스레드는 자신의 Stack 메모리를 갖으며, 다른 스레드 Stack 메모리에 접근할 수 없다.

 

Heap


Heap 영역은 메모리에 실제 객체를 저장한다 Heap영역은 주로 긴 생명주기를 갖는 데이터들이 저장된다. 모든 Object 타입 (Integer, String, ArrayList, HashMap 등 )은 Heap 영역에 생성된다. Heap 영역에 있는 Object들을 가리키는 레퍼런스 변수가 Stack에 저장된다.

String host = "hostName";

String은 내부적으로 new 생성자를 통해 메모리가 할당된다. new 키워드는 Heap에 충분한 여유 공간이 있는지 확인하고, 메모리에 String 타입의 객체를 만들고 Stack에 'host'라는 참조 변수를 통해 해당 객체로 접근한다. 사실 Heap 구조는 위의 그림처럼 단순하지 않다. Heap 자체는 크게 3가지 영역으로 나누고 있다. 이 영역들은 GC(Garbage Collection)의 동작을 지원한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함