티스토리 뷰
반응형
다 쓴 객체 참조를 해제하라
자바에서는 기존 managed 언어(C/C++)과 다르게 GC를 갖춰 프로그래머가 메모리에 신경을 덜 써도 됐다.
하지만 모든 메모리누수가 사라진 것은 아니다.
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);
}
}
다음 소스코드에서 메모리 누수가 나는 곳을 찾아보자.
pop의 메서드 안에서 다쓴 Object를 GC는 회수하지 않는다. GC는 자신을 참조하는 모든 객체들이 해제 되었을때 그 객체를 메모리에서 회수하게 된다.
하지만 이 코드에서는 elements에서 size만 줄였을 뿐 생성된 객체에 있어서는 참조를 해제한 적이 없다.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; // 다 쓴 참조 해제
return result;
}
위와 같이 꼭 버려지는 object에 대해서 참조를 해제 해주어야만 GC에서 객체를 회수해 갈 수 있다.
하지만 책에서는 null처리를 남용할 경우에는 프로그램을 필요 이상으로 지저분하게 만든다고 추천하지 않는다.
근본적으로 위의 Stack클래스에서는 자기 메모리를 직접 관리하고 있다.
elements 배열로 저장소 풀을 만들어 관리하기 때문이다.
728x90
반응형
'Programming_language > Java' 카테고리의 다른 글
Class 내 Method 추상화(Feat. Consumer, BiConsumer, Function) (1) | 2024.10.09 |
---|---|
[Effective Java] 3. 의존 객체 주입 (0) | 2022.11.09 |
[Effective Java] 2. 빌더 패턴 (0) | 2022.11.09 |
[Effective Java] 1. 정적 팩토리 메서드 (0) | 2022.11.07 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- API
- spring
- spring boot
- apache kafka
- frontend
- feign client
- broker
- logback
- 프론트엔드
- K8S
- Firebase
- centos
- React
- apache
- Producer
- docker
- OS
- Front
- JPA
- Container
- Java
- Data Engineering
- NextJS
- KAFKA
- 리액트
- Linux
- zookeeper
- cs
- consumer
- rhel
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
250x250