본문 바로가기

Server Oriented/Java & JSP

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 (이번엔 생각한 대로 처리 됨)