티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기

Memory Leak 예제

public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } private void ensureCapacity() { if (elements.length == size) { elements = Arrays.copyOf(elements, 2*size + 1); } } }

Memory leak 은 스택이 커졌다가 줄어들면서 제거한 객체들을 쓰레기 수집기가 처리하지 못해서 생긴다. 스택이 만기 참조(obsolete reference)를 제거하지 않기 때문이다. 
 만기 참조 = 다시 이용되지 않을 참조
위 스택의 경우에는 elements 배열에서 실제로 사용되는 부분을 제외한 나머지 영역에 보관된 참조 드이 만기 참조다. 첨자 값이 size 보다 작은 곳에 있는 요소들은 실제로 쓰이는 참조들이지만, 나머지 영역에 있는 참조들은 그렇지 않다.
 위 코드를 개선해보면 다음 과 같다.

public Object pop() { if (size==0) { throw new EmptyStackException(); } Object results = elements[--size]; elements[size] = null; return results; }


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함