이번 3회 코테에서도 어김없이 3번 문제에는 cs가 나왔습니다. 그런데, 기존 3번 문제는 골드 5로 평가되었던데 비해, 3회 3번은 얘네들보다 난이도가 높았습니다. 가희와 쓰레기 놀이는 어떤 문제였는지, 출제 목적이 무엇이였는지부터 상세하게 설명을 하면서 풀이를 작성하도록 하겠습니다. 먼저, 이 문제를 가져오게 된 계기는 그리 어렵지는 않았습니다. 이 글에서도 간접적으로 볼 수 있긴 하지만, 결정적인 계기는 logback의 MDC를 보다가 threadLocal을 보게 되었고, 그 안에 있는 WeakReference를 보게 된 것이 결정타였습니다. gc가 약하게 도달 가능한 객체들을 모두 지워야 겠다는 판단을 했을 때, finalize가 된다고 되어 있는데 이것을 구현해 보라는 목적도 있었고요. 제한을 ..
Gc 검색 결과
어느 분하고, LinkedList 문제에 대해서 이야기를 나누다가, jvm 관련 이야기까지 나왔던 기억이 납니다. 그에 대해서, 어딘가에 정리한다 해 놓고, 깜빡 잊었는데요. 이제서야 정리해 봅니다. 저는 jdk8에서 프로그램을 실행하였습니다. jvm의 gc 로그를 출력하기 위해서는 option을 만져야 합니다. Run에서 Edit Configurations에 들어가 보겠습니다. 창이 하나 뜨는데요. 여기서 add Run Option을 눌러 보겠습니다. add VM options에 체크해 주겠습니다. 그리고 -verbose:gc를 옵션으로 주겠습니다. 해당 옵션은 gc event를 출력하는 옵션입니다. 이 옵션을 주고 실행시킬 프로그램은, 해시맵 hm에 Dog 객체 30만개를 넣고, 새롭게 생성되는 Do..
System.gc 함수를 쓰지 말라는 이야기는 많이 듣곤 합니다. 왜 그럴까요? 예제 프로그램을 보겠습니다. class A가 있고, 이 클래스 내부에는 finalize가 오버라이딩 되어 있습니다. 이 메서드 안에 들어오면 shared.count가 하나 증가합니다. 정리를 하면, 객체 A가 정리가 되면, shared 클래스 내부에 있는 클래스 변수인 count가 하나 증가합니다. 그리고 class A 안에는 int형 배열 10개가 있습니다. 이제 Main 클래스의 main 메소드를 보겠습니다. 크게 어려운 것은 없어 보입니다. 10개의 객체 A 참조값을 저장할 수 있는 배열을 선언합니다. 그리고, 2만번의 loop를 돌 때 마다, 배열 A에 새로운 A의 참조값 10개를 넣습니다. 이를 그림으로 표현하면 위..
finalize 함수는 Object 클래스에 있는 메서드입니다. 공식 문서에서는 아래와 같이 설명하고 있습니다. 여기서 중요한 것은, gc가 해당 object를 참조하는 레퍼런스가 없을 때 Call 한다는 것입니다. 예제 프로그램을 몇 개 보면서 이해해 보도록 하겠습니다. 1번째 프로그램입니다. Obj는 Object를 상속받습니다. 따라서, finalize를 오버라이딩 할 수 있습니다. finalize가 gc에 의해서 호출이 되면, Common.rm이 증가하게 되는데요. 새로운 Obj 객체 1000만개를 생성하기만 했습니다. 그리고 80초동안 sleep을 시키고, Common.rm을 출력하였습니다. 1000만이 출력되지 않았다는 것이 중요합니다. 100개의 Obj를 새로 생성한 다음에 Common.rm을..
재미있는 프로그램을 몇 개 만들어 보겠습니다. 제가 정의한 MObj는 아래와 같습니다. 평범한 getter 메소드가 있습니다. 그리고 더 평범한 equals 메소드가 있습니다. 그리고 hashCode가 있는데요. 리턴값이 0부터 1999까지의 정수 중에서 Random하게 뽑은 값입니다. 딱 봐도 뭔가 이상하다는 것을 알 수 있습니다. 이 이상해 보이는 프로그램을 왜 예시로 들었는지는 천천히 설명해 보도록 하겠습니다. 저번에 가비지는, 도달 불가능한 객체라고 하였습니다. 이것은 gc가 알아서 회수를 할 겁니다. 문제는, 필요 없는 객체인데, 참조 (흔히, Strong reference)가 되는 경우가 있을 수 있습니다. 이 경우에, 그 객체는 gc의 수거 대상이 되지 않습니다. 예를 하나 들어보겠습니다. ..
최근댓글