Garbage Collection(1)


1. 개념

1) garbage collection

Java 언어에서 new 연산자를 사용하여 생성된 객체가, 자동으로 제거되는 것을 garbage collection 이라 한다.
어떤 객체를 참조하는 변수가 하나라도 있다면, 그 객체는 사용되고 있는 것이고,
반대로 어떤 객체를 참조하는 변수가 하나도 없다면, 그 객체는 사용될 수 없으니 garbage collection 된다.

garbage collection은 JVM(Java virtual machine)에 의해서 자동으로 실행되는데,
(방문해보면서 mark 해놨는데 가리키고 있는게 아무것도 없는데 존재하면 그게 garbage 이다.)
이걸 확인하려면 메모리를 다 둘러봐야해서 시간이 꽤 걸리는 작업이기 때문에, 가끔 실행된다.

System은 클래스이다. gc()는 System 클래스의 static 메소드이다.

Q. 그렇다면 garbage collection이 자동으로 잘 처리 되도록 하려면 어떻게 해야할까?
A. 더 이상 사용하지 않는 객체를 참조하고 있는 변수에 null을 대입하자.
변수에 의해 참조되지 않는 객체는 자동으로 garbage collection이 되기 때문이다.


2) weak generational hypothesis

많은 경우에 Java 객체는 다음과 같은 특징을 갖는다.

대부분의 객체는 짧은 시간 안에 garbage가 된다.
메소드 내에서 잠깐 사용되고 끝나는 객체가 많다.
이런 객체는 지역 변수에 대입하여 사용한다.
메소드가 리턴될 때, 지역 변수가 없어지면, 그 지역 변수에 의해서만 참조되던 객체는 garbage가 되고, garbage collection 대상이 된다.

오래된 객체
지역 변수가 아니라, 멤버 변수에 의해 참조되는 객체는 일찍 제거되지 않고 꽤 오래 살아남는다.
static 멤버 변수에 의해 참조되는 객체는 더욱 오래 살아남는다.
즉 지역 변수가 참조하는 객체들은 금방 garbage collection 되지만,
멤버 변수가 참조하는 객체들은 꽤 오래 살아남는다.

오래된 객체의 멤버변수가 젊은 객체를 참조하는 경우는 아주 드물다.
오래된 객체의 멤버 변수가 참조하는 객체도 오래된 객체일 확률이 높고, 일찍 제거될 객체일 확률은 낮다.
일찍 제거될 객체는 대부분 지역 변수에 대입되어 사용되기 때문이다.

위 특징들을 활용하여 Java virtual machine의 garbage collection 기능이 구현되었다.
garbage collection의 성능이 좋아진 원인은 이러한 특징을 잘 잡았기 때문이다.


3) Java 컴파일








4) process와 virtual memory

애플리케이션이 운영체제 메모리로 로드(load)되어 실행될 때, 이것을 프로세스(process)라고 부른다.
즉 운영체제 메모리로 로드되어 실행되는 애플리케이션을 프로세스라고 부른다.

운영체제는 프로세스에게 자원을 제공한다. 제공되는 자원은, 메모리, 파일, 소켓(socket), 세마포어(semaphore), 파이프(pipe) 등이다.
운영체제에 의해서, 각각의 프로세스는 서로 격리된다.
어떤 프로세스의 메모리나 자원을, 다른 프로세스가 건드릴 수 없다.



5) stack, heap, data, text segment

프로세스에게 주어진 메모리 공간은 세그먼트들로 나눠 사용된다.







6) process와 thread

process 내부에 thread가 생성된다.
process가 시작될 때, main thread가 자동으로 생성되고,
다른 스레드는 스레드 생성 명령을 실행하여 생성해야 한다.

스레드는 stack segment를 따로 소유한다.
스레드를 한 개 생성할 때마다, stack segment도 한 개 생성해서, thread에게 할당해야 한다.
heap segment, data, text segment는 thread들 사이에 공유된다.


7) HotSpot java virtual machine 구조

HotSpot JVM의 주요 구성요소는 다음과 같다.


runtime data areas 내부에서
method area
이영역에서 위치한 항목들은 다음과 같다.

method area 이름은 자주 사용되는 이름이 아니다.
이 영역의 대표적인 이름은, permanenet generation 영역이다. (Java7까지)
Java8 부터 이 영역의 이름이 metaplace로 바뀌었다. (세부 구조도 변경되었다.)






8) Java thread 와 메모리 영역

각 Java thread 마다 따로 소유하는 메모리 영역

여러 Java thread들이 공유하는 메모리 영역