티스토리 뷰

Java/문법

4. 가비지 컬렉터 : Garbage Collector & 메모리

알 수 없는 사용자 2018. 10. 5. 01:53


이번 포스팅은 가비지 컬렉션에 대한

포스팅이 되겠습니다.

가비지 컬렉션은 메모리에 대한

이해도 필요하다 생각하기 때문에

함께 포스팅하겠습니다.


============================================================


Memory & Garbage Collector



1. Garbage Collector 가 무엇일까?


일단 가비지 컬렉터가 무엇인지 간단하게 알고 원리를 파악하는 것이 좋습니다.

대게 긴 코드나 복잡한 코드를 설계할 때 안 쓰는 변수나 아무것도 참조하지 않는 낭비되는 변수가 나오게 됩니다.

이런 쓸데없이 메모리를 잡아먹는 것들을 자동으로 삭제해주는 기능이 가비지 컬렉터입니다. 

그렇기 때문에 자동 메모리 관리라고 부르기도 합니다.



2. 메모리와 어떻게 관련이 있을까?


우리가 보통 일반 프로그램을 작동시키는데 필요한 메모리는 os가 관리하게 됩니다. 자바의 실행 프로그램인 JVM(자바가상머신) 역시 os에게 메모리를 할당받아 공간을 생성하는 것입니다. 모든 프로그램들은 os 위에서 돌아간다고 할 수 있습니다.

만약 os가 가진 메모리의 공간을 효율적이지 못하고 전부 줘버린다면 다른 프로그램들에 영향이 갈 것입니다.

그렇기 때문에 os는 가진 메모리를 일정 부분만 각 프로그램들에 할당해 주는 식입니다.




만약 JVM이 프로그램을 실행하다가 메모리 공간이 더 필요하게 된다면 os에 요청하게 됩니다.

그림처럼 JVM이 다시 메모리를 요청하기 전에 다른 프로그램이 메모리를 할당해간다 해서 이전에 받은 메모리와 이후에 받은 메모리 공간이 분리되어 있다고 볼 수는 없습니다.

물리적으로는 분리되어 있다고 할 수 있지만, 실질적으로 JVM이 변수나 함수 등이 저장될 메모리 주소를 할당할 때 JVM이 할당받은 메모리 안에서 절대주소가 아닌 상대주소로 주소 값을 할당(이것을 offset 주소라 합니다.) 하므로 논리적으로는 하나의 메모리처럼 작동한다고 볼 수 있습니다.


우리가 코드를 설계할 때 객체 타입이나 int나 String과 같은 타입으로 변수를 생성할 때 이것이 모두 JVM이 메모리에 할당해 주는 공간으로 쓸데없는 메모리를 줄여주는 역할입니다.




3. Garbage Collector 예제


Rectangle 객체 2개를 생성하여 알아보도록 하겠습니다.

Rectangle r1 = new Rectangle();
Rectangle r2 = r1;
r1 = new Rectangle();
r2 = r1;


위 코드와 같이 r1객체를 하나 만든 다음 r2는 r1과 같다고 하겠습니다.

그런 다음 r1에 새로운 객체를 생성하여 저장한 다음 다시 r2는 r1이라고 지정하였습니다.

그렇다면 맨 처음 만든 Rectangle 객체는 어떻게 될까요?


아무도 참조하지 않는 쓰레기 객체가 되는 것입니다.

애초에 개발자가 다시 저 객체를 참조하고 싶어도 주소 값을 잃어버린 상태라 할 수 있기 때문에 참조할 수가 없는 것입니다.


이런 쓸모없이 정리되지 않은 메모리를 가비지 컬렉터가 자동으로 삭제해주는 것입니다.




4. Garbage Collector 특징 정리


쓸모없는 메모리 삭제할 때 호출되는 메소드는 finalize입니다.

finalize를 오버라이드해서 특정 문구를 출력하여 확인할 수 있습니다. 하지만 이렇다 하는 것만 알아두고 사용은 안하는 것이 좋습니다.


1. 가바지 컬렉터는 프로그래머가 구현할 수 없습니다.

2. 가비지 컬렉터가 정리하고자 하는 대상은 객체이지 참조하고 있는 대상이 아닙니다.

3. 객체에 할당된 메모리를 명시적으로 해제할 수도 없습니다.

4. 가비지 컬렉터가 어떤 순으로 객체를 정리하는지 알 수 없고 가비지 컬렉터가 언제 수행될지 정확히 알 수 없습니다.

   그렇기 때문에 가비지 컬렉터에게 요청할 수 있는 법이 몇 가지 있긴 하지만 웬만하면 사용 안 하는 것이 좋습니다.

5. 가비지 컬렉터가 바로 객체의 매모리를 해지하는 것이 아니라 JVM의 판단에 따라 동작하는 것으로 사용자가 강제할 수 없고 요청만 할 수 있습니다.


c를 배우고 자바를 공부하시는 분은 다른 점을 눈치채셨을 것입니다. c의 경우 사용자가 직접 메모리를 해제시켜줘야 하는 불편함이 존재했습니다. 하지만 자바에서는 사용자가 직접 메모리를 해제하지 않아도 자동으로 해제되고 또한 메모리를 해제할 수 있는 명령어 또한 존재하지 않습니다.




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함