티스토리 뷰

http://www.sdnkorea.com/blog/232에 가보면 해당 플랫폼을 위한 자바 버츄얼 머신의  비표준 옵션에 관련된 설명입니다.  이 글은 가비지 컬렉션을 프로그램 내에서 실행시킬 수 있는 방법을 찾다가 읽게 되었는데, 그래서 이 글의 요점은 System.gc() 를 이용해서 청소기를 실행시키는 방법입니다.

저는 자바를 이용해서 간단한 텍스트 마이닝을 하고 있습니다.
텍스트를 많이많이 메모리에 올리고, 거기서 단어를 추출해서 다시 많은 단어가 메모리에 올라가고,
그 단어들에 대해서 tfidf 를 계산해서 다시 메모리에 다 올리고...하는 통에 많은 메모리를 사용하게 되었습니다. -Xmx1024M 옵션을 사용하게 되었습니다. 그러나 안심한 것도 한 순간.
초초보인 제가 짠 프로그램은 1024M를 넘어 죽어버리고 말았습니다.
불쌍한 녀석.
그래서 메모리를 적게 사용하고자 프로그램을 수정해주었습니다.
일단 사용하고난 객체는 null 을 할당하여 가비지 컬렉터에 도움을 주고자 하였으며,
편리함에 잘 사용하고 있는 Java Collecion의 클래스 들인 ArrayList, HashMap, LinkedList 등등의 clear() 메소드를 전혀 사용하고 있지 않았던 것이었습니다. 흠.
사실, System.gc() 메소드를 사용하지 않고 문제를 해결하려 했으나...역시 메모리는 많이 사용하더군요.

그런데 도대체 clear() 메소드는 무엇을 하는 녀석인가! 하여 소스를 살짝보니...

ArrayList의 clear() 메소드입니다.
사용자 삽입 이미지
ArrayList의 객체가 저장되어 있는 elementData를 다 쭈~욱 null 로 할당한다음에,
size를 0으로 할당하는군요. ㅡㅡㅋ

LinkedList의 clear() 메소드
사용자 삽입 이미지

















이건 모지... LinkedList에는 Entry<E>라는 pirvate static class가 정의되어 있는데,
next와 previous 를 갖고, element를 저장할 수 있는....
어쨌거나 next와 previous, 그리고 element에 null을 할당한 후 다음 element를 넘어가는 군요.
역시 modCount++; 을 실행시키고 있고...

ㅡㅡㅋ 모, HashMap 도 그냥 null을 할당하는 정도...
그런데, modCount++은 도대체 왜 하는 것인가요?
그래서! F3키를 눌러 modCount로 고고씽~

ArrayList의 modCount는 AbstractList 에 있는
protected transient int modCount 입니다.
주석이 영어로 길게 달려 있지만 읽기가 귀찮으므로므로므로....
대강 size 가 수정된 회수를 나타내는 군요. ㅡㅡㅋ

모...어찌됐건.

실행되는 동안 청소기는 동작하지 않는 듯 했고. 메모리는 어느새 1G에 근접했으나,
997M에서 멈추었습니다. 흠...TimerTask로 하루에 한번씩 실행되게 되어 있어
계속 그정도 메모리는 유지하더군요.

다음. System.gc() 를 코드에 넣고 실행시켜보았습니다.
아. 뭥미.....별거 모 안해주는 군요. 반전인가...

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함