티스토리 뷰
![]() |
|
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;
}
'JAVA > Effective Java' 카테고리의 다른 글
규칙7 종료자 사용을 피해라 (0) | 2018.12.19 |
---|---|
규칙5 불필요한 객체는 만들지 말라 (0) | 2018.12.19 |
규칙4 객체 생성을 막을 때는 private 생성자를 사용하라 (0) | 2018.12.19 |
규칙3 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하자 (0) | 2018.12.19 |
규칙2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라 (0) | 2018.12.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- referencedColumnName
- mariada-connector
- ResultSet
- mariadb-connector-j
- reactor
- Seperate Chaining
- notify()
- reative
- RoutePredication
- dynamodb
- msyql-connector-java
- RouteDefinition
- ConcurrentHashMap
- GlobalFilter
- AbstractMethodError
- router
- custom config data convertion
- Flux
- rate limit
- aurora
- Lazy
- wait()
- MariaDB
- spring cloud gateway
- HashMap
- DyanomoDB
- circurit breaker
- notifyAll()
- N+1
- getBoolean
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함