Effective Java 3/E
์์ดํ 7: ๋ค ์ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํด์ ํ๋ผ
1. ๋ฉ๋ชจ๋ฆฌ ๋์ ํด๊ฒฐ์ ๋ค ์ด ์ฐธ์กฐ๋ฅผ null ์ฒ๋ฆฌํ์
GC๊ฐ ๋ค ์ด ๊ฐ์ฒด๋ฅผ ์์์ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ฒฝ์ ์ฐ์ง ์์๋ ๋๋ค๊ณ ์คํดํ ์ ์๋ค.
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 object) {
ensureCapacity();
elements[size++] = object;
}
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
return elements[--size];
}
/**
* ์์๋ฅผ ์ํ ๊ณต๊ฐ์ ์ ์ด๋ ํ๋ ์ด์ ํ๋ณดํ๋ค.
* ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ๋๋ ค์ผ ํ ๋ ๋ง๋ค ๋๋ต 2 ๋ฐฐ์ฉ ๋๋ฆฐ๋ค.
*/
private void ensureCapacity() {
if (elements.length == size) {
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
์ ์ฝ๋๋ฅผ ๋ณด๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ด๋ณด์ด์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์คํ์ด ์ปค์ก๋ค๊ฐ ์ค์ด๋ค์์ ๋ ์คํ์์ ๊บผ๋ด์ง ๊ฐ์ฒด( pop() ์ผ๋ก ๊บผ๋ด์ง ๊ฐ์ฒด )๋ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ค๊ณ ํ๋๋ผ๋ GC ๊ฐ ํ์ ํ์ง ์๋๋ค.
๊ฒฐ๊ตญ ์ด ์คํ์ด ๊ฐ์ฒด๋ค์ ๋ค ์ด ์ฐธ์กฐ(obsolete reference) ๋ฅผ ๊ณ์ ๊ฐ๊ณ ์๊ฒ ๋๊ณ , ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ด๋ ์ฑ๋ฅ์ด ์ ํ๋๊ฒ ๋๋ค.
์ด์ ๋ํ ํด๋ฒ์ ์์ฃผ ๊ฐ๋จํ๋ค. pop() ์คํ ์ ๊บผ๋ด์ง ๊ฐ์ฒด๋ null ์ฒ๋ฆฌ ํด์ฃผ๋ฉด ๋๋ค.
public Object pop(){
if(size == 0){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
2. ์์ธ์ ์ธ null ์ฒ๋ฆฌ
Stack์ ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ณ , ๊ฐ์ฒด ์์ฒด๊ฐ ์๋๋ผ ๊ฐ์ฒด์ฐธ์กฐ๋ฅผ ๋ด๋ elements ๋ฐฐ์ด๋ก ์ ์ฅ์ ํ์ ๋ง๋ค์ด ์์๋ฅผ ๊ด๋ฆฌํ๋ค.
๋ฐฐ์ด์ ํ์ฑ ์์ญ์ ์ํ ์์๋ค์ด ์ฌ์ฉ๋๊ณ , ๋นํ์ฑ ์์ญ์ ์ฐ์ด์ง ์๋๋ค. GC ๊ฐ ๋ณด๊ธฐ์ ์ด ๋นํ์ฑ ์์ญ์ ๊ฐ์ฒด๋ค๋ ๊ฐ์ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ๋ค ์ด ์ฐธ์กฐ๋ฅผ null ์ฒ๋ฆฌ ํด์ฃผ์ด ์ด์ ๋์ด์ ์ฐ์ง ์๋ ๋ค๋ ๊ฒ์ GC์๊ฒ ์๋ ค ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์ง ํ ์ ์๋ค.
3. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ฃผ์ํด์ผ ํ๋ ๊ฒฝ์ฐ
1. ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ํด๋์ค
- ์ ์คํ์ ๊ฒฝ์ฐ์ ๊ฐ์ด ์์๋ฅผ ๋ค ์ฌ์ฉํ ์ฆ์ ์์๊ฐ ์ฐธ์กฐํ ๊ฐ์ฒด๋ค์ null์ฒ๋ฆฌ ํด์ฃผ์ด์ผ ํ๋ค.
2. ์บ์
- ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์บ์์ ๋ฃ๊ณ , ์ฌ์ฉ์ด ๋๋ ์ดํ์๋ ์ฐธ์กฐ๋ฅผ ํด์ ํ์ง ์์ ๊ฒฝ์ฐ
์บ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ํด๊ฒฐ
1. WeakHashMap ์ ์ด์ฉํ์ฌ ์บ์๋ฅผ ๋ง๋ค์!
-> ๋ค ์ด ์ํธ๋ฆฌ๋ ๊ทธ ์ฆ์ ์๋์ผ๋ก ์ ๊ฑฐ๋ ๊ฒ์ด๋ค!
2. ์๊ฐ์ด ์ง๋ ์๋ก ์ํธ๋ฆฌ์ ๊ฐ์น๋ฅผ ๋จ์ด๋จ๋ฆฌ๊ณ ScheduledThreadPoolExecutor ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ฅผ ํ์ฉํ๊ฑฐ๋ ์บ์์ ์ ์คํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ ๋ ๋ถ์ ์์ ์ผ๋ก ์ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฒญ์
3. LinkedHashMap ์ removeEldestEntry ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์คํธ๋ฆฌ ์ถ๊ฐ ์ ๋ถ์์์ ์ผ๋ก ์ํ
4. ๋ณต์กํ ์บ์๋ฅผ ์์ฑํ ๋ java.lang.ref ํจํค์ง๋ฅผ ์ง์ ํ์ฉํด์ผํจ.
3. ๋ฆฌ์ค๋(Listener) ํน์ ์ฝ๋ฐฑ(Callback)
- ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๋ฐฑ์ ๋ฑ๋ก๋งํ๊ณ ํด์งํ์ง ์๋ ๊ฒฝ์ฐ ์ฝ๋ฐฑ์ ๊ณ์ ์์ธ๋ค.
-> WeakHashMap ์ ํค๋ก ์ ์ฅํ๋ค. ( ์ฝ๋ฐฑ์ ์ฝํ ์ฐธ์กฐ๋ก ์ ์ฅํ๋ฉด GC๊ฐ ์๊ฑฐํด๊ฐ๋ค.)