* 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 (이번엔 생각한 대로 처리 됨)
'Server Oriented > Java & JSP' 카테고리의 다른 글
PreparedStatement 의 clearParameters() 는 불필요..? (1) | 2022.06.24 |
---|---|
오라클 varchar2(4000) 과 한글의 오묘한 만남..? (0) | 2022.06.24 |
ORA-22990: LOB 위치는 트랜잭션을 걸칠 수 없습니다 (0) | 2021.11.15 |
PreparedStatement SQL 문에 ? 를 적용할 수 없는 것 (0) | 2021.09.29 |
header 의 Referer 가 null 인 경우 (0) | 2021.07.19 |