Java는 프로그램 코드에서 메모리를 명시적으로 지정하여 해제하지 않는다. 가끔 명시적으로 해제하려고 해당 객체를 null로 지정하거나, System.gc()를 호출하는 개발자가 있다. null로 지정하는 것은 큰 문제가 안되지만, System.gc()를 호출하는 것은 시스템의 성능에 매우 큰 영향을 끼치므로 System.gc()는 절대로 사용하면 안된다!
하나의 메서드 영역 내에서 객체를 여러 개 생성하는 코드를 짜다가 위와 같은 고민을 하게 되었다. 다행히 System.gc()에 대해서는 지식 조차 없었고, null로 지정하는 일을 하게되었다. 그러나 Garbage Collector의 존재에 대해서는 이름만 알고 제대로 모르는 것 같아 한번 정리해보고자 한다.
Garbage Collector의 배경 가설 (weak generational hypothesis)
- 대부분의 객체는 금방 접근 불가능 상태가 된다.
- 오래된 객체에서 젊은 객체로의 참조행위는 아주 적게 존재한다.
=> 대부분의 객체는 생겨나자마자 쓰레기가 된다...!!
JVM의 두개의 공간
- Young Generation : 새롭게 생성한 객체의 대부분이 여기에 위치, 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Old Generation : Young 영역에서 살아남은 객체가 여기로 복사된다. Young영역보다 크기가 크게 할당되며, GC는 적게 발생한다.
할당 -> young 영역 -> 살아남은 객체가 이동-> Old영역
출처 (양질의 한글로 된 글들임..!!)
jvm 메모리 & GC 종류
https://d2.naver.com/helloworld/1329
이클립스에서 heap영역 보기
http://blog.naver.com/PostView.nhn?blogId=mebume&logNo=221102040058&redirect=Dlog&widgetTypeCall=true&directAccess=false
java.lang.ref 패키지의 객체의 reachability 관리 클래스
https://d2.naver.com/helloworld/329631