[Java] Garbage collection
yeoseon opened this issue · comments
Reference
- Flyweight 패턴 참고
인스턴스를 공유하기 위해 생성된 인스턴스를 보관(pool
)하기 때문에, 한번 생성된 인스턴스는 GC 대상에 해당하지 않아 계속 안고 있게 된다.
인스턴스를 관리하는 기능을 Java에서 실현할 경우에는 GC 대상이 되지 않는다. - https://yaboong.github.io/java/2018/06/09/java-garbage-collection/
- https://d2.naver.com/helloworld/1329
담아있으면 좋을 내용
- 프로그램의 성능을 고려할 때 생각할 점
Garbage Collection
개요
Java의 프로그램은 new
에 의해 메모리를 확보한다.
많은 메모리를 확보하다 보면 메모리가 부족하데 된다.
메모리가 부족할 때 Java의 프로그램을 동작시키는 가상 기계(?)는 garbage collection이라는 처리를 시작한다.
이것은 자신의 메모리 공간(heap 영역)을 조사해서, 사용되지 않는 인스턴스를 해제하여 메모리의 빈 영역을 늘리는 처리이다.
GC 기능 덕분에 Java 프로그래머는 일단 new
한 인스턴스를 delete
할 필요 없이 그대로 방치할 수 있다. (원래 delete
도 없다.)
GC의 대상
핵심은 사용되지 않는 인스턴스를 해제한다. 라는 부분이다.
GC를 실행할 때에, 각 인스턴스에 대해 garbage여부에 대한 판단이 이루어지지만, 외부에서 참조되고 있는 인스턴스는 '사용되고 있다'고 간주하여 garbage 대상이 되지 않는다.
위의 Flyweight 패턴에서처럼 인스턴스를 관리하는 기능을 사용하게 되면, 해당 인스턴스는 어딘가에 보관되어 참조되고 있기 때문에 GC의 대상이 되지 않는다.
이 경우, 오랜 기간 동작하는 프로그램을 설계하는 경우나 적은 메모리에서 동작하는 프로그램을 설계할 경우에는 이 점을 꼭 기억하고 고려해야 한다.
명시적으로 삭제할 수 없지만, 참조를 없앨 순 있다.
관리되고 있는 인스턴스를 garbage 대상으로 하기 위해서는 명시적으로 참조를 없애서 관리되지 않도록 할 필요가 있다.
Flyweight 패턴의 예시에서는 인스턴스를 HashMap으로 관리하고 있는데, 이로부터 해당 인스턴스를 포함하는 엔트리를 삭제하면 참조를 없앨 수 있다.
더 자세하게 찾아서 정리하고 Close 할 것.
(가상기계가 뭔지.... 등등등)