Collections 안에 다른 Collections 을 넣었을 때의 GC
* Hashtable 안에 다른 Hashtable 을 넣었을 때의 GC
(List 안에 Hashtable 을 넣는 것이 바람직할듯..)
Hashtable ht1 = null;
Hashtable ht2 = null;
try{
ht1 = new Hashtable();
ht2 = new Hashtable();
ht2.put("test2","test3"); // ht2 에는 문자열인 "test3" 세팅
ht1.put("test1, ht2); // 자, ht1 에 ht2 를 넣었으니...
}catch(Exception e){
}finally{
System.out.println("+++.ht1:"+ht1); // +++.ht1:{test1={test2=test3}}
// 여기서는 테스트를 위한 것이지만, 실전에선 if 로 체크하는 것이 안전
if(ht1!=null) try{ ht1.clear(); }finally{ ht1 = null; }
System.out.println("+++.ht1:"+ht1); // +++.ht1:null (예상한 대로 clear() 잘 작동)
System.out.println("+++.ht2:"+ht2); // +++.ht2:{test2=test3}
// 생각하기에는 ht1 을 clear 했으니까, ht2 도 clear 되었겠지 하겠지만..
// 진실은 ht2 가 살아 남는 것. GC 의 악몽 시작.
// 수십명이 방문하는 프로세스라면 부하 걱정 없을테지만,
// 수백명이 동시에 이용하는 프로세스라면 과부하 명백.
// 평소에 이렇게 작업했다면, 이제는..
// 명시적 GC 로 Collection 안에 들어 있는 또 다른 Collection 도 모두 날려야..
}
상기 finally 안의 내용에서 GC 를 보완하면..
System.out.println("+++.ht1:"+ht1); // +++.ht1:{test1={test2=test3}}. 이전과 동일.
// Enumeration 대신에 Iterator 를 사용하라고는 하는데.. 여기선 JDK 버전 때문에..
Enumeration en = ht1.elements(); // elements() 대신 keys() 를 사용하면 에러.. ㅠ
while(en.hasMoreElements()){
Hashtable htGC = (Hashtable)en.nextElement();
htGC.clear(); htGC = null; // clear() 한 다음에는 반드시 null 을 세팅하자. GC 에게 잘 보여야.. ㅎ
}
if(ht1!=null) try{ ht1.clear(); }finally{ ht1 = null; } // 이전과 동일.
System.out.println("+++.ht1:"+ht1); // +++.ht1:null (이전과 동일)
System.out.println("+++.ht2:"+ht2); // +++.ht2:null (이번엔 생각한 대로 처리 됨)