yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Java] Garbage collection

yeoseon opened this issue · comments

Reference

담아있으면 좋을 내용

  • 프로그램의 성능을 고려할 때 생각할 점

Garbage Collection

개요

Java의 프로그램은 new에 의해 메모리를 확보한다.
많은 메모리를 확보하다 보면 메모리가 부족하데 된다.
메모리가 부족할 때 Java의 프로그램을 동작시키는 가상 기계(?)는 garbage collection이라는 처리를 시작한다.
이것은 자신의 메모리 공간(heap 영역)을 조사해서, 사용되지 않는 인스턴스를 해제하여 메모리의 빈 영역을 늘리는 처리이다.

GC 기능 덕분에 Java 프로그래머는 일단 new한 인스턴스를 delete할 필요 없이 그대로 방치할 수 있다. (원래 delete도 없다.)

GC의 대상

핵심은 사용되지 않는 인스턴스를 해제한다. 라는 부분이다.
GC를 실행할 때에, 각 인스턴스에 대해 garbage여부에 대한 판단이 이루어지지만, 외부에서 참조되고 있는 인스턴스는 '사용되고 있다'고 간주하여 garbage 대상이 되지 않는다.

위의 Flyweight 패턴에서처럼 인스턴스를 관리하는 기능을 사용하게 되면, 해당 인스턴스는 어딘가에 보관되어 참조되고 있기 때문에 GC의 대상이 되지 않는다.

이 경우, 오랜 기간 동작하는 프로그램을 설계하는 경우나 적은 메모리에서 동작하는 프로그램을 설계할 경우에는 이 점을 꼭 기억하고 고려해야 한다.

명시적으로 삭제할 수 없지만, 참조를 없앨 순 있다.

관리되고 있는 인스턴스를 garbage 대상으로 하기 위해서는 명시적으로 참조를 없애서 관리되지 않도록 할 필요가 있다.
Flyweight 패턴의 예시에서는 인스턴스를 HashMap으로 관리하고 있는데, 이로부터 해당 인스턴스를 포함하는 엔트리를 삭제하면 참조를 없앨 수 있다.

더 자세하게 찾아서 정리하고 Close 할 것.
(가상기계가 뭔지.... 등등등)