[java] 일반적으로 자바에서 발생하는 메모리 누수는 어떤 범위에 해당하나요?
- 객체 참조 유지: 더 이상 사용하지 않는 객체를 참조하는 변수나 컬렉션 요소들이 메모리에 계속 유지되는 경우 발생합니다. 이는 강한 참조 (strong reference)에 의해 발생할 수 있습니다.
예를 들어, 다음과 같은 상황에서 메모리 누수가 발생할 수 있습니다.
public class MemoryLeakExample {
private List<Object> objects = new ArrayList<>();
public void addObject(Object obj) {
objects.add(obj);
}
public void removeObject(Object obj) {
objects.remove(obj);
}
}
위의 예시에서는 objects
리스트가 메모리에 계속 유지되는데, removeObject
메소드를 호출해도 objects
리스트에 대한 참조가 남아있기 때문입니다. 따라서 MemoryLeakExample
객체가 더 이상 필요하지 않더라도 메모리에 계속 유지됩니다.
- 리소스 릭: 자바에서 외부 리소스를 사용하는 경우, 해당 리소스를 제대로 해제하지 않을 경우 메모리 누수가 발생할 수 있습니다. 이는 파일, 네트워크 연결, 데이터베이스 연결 등 다양한 리소스에 해당할 수 있습니다.
예를 들어, 다음과 같은 상황에서 메모리 누수가 발생할 수 있습니다.
public class ResourceLeakExample {
public void openFile() {
File file = new File("example.txt");
// 파일 사용
}
}
위의 예시에서는 openFile
메소드에서 파일을 열고 사용하지만, 파일을 제대로 닫지 않은 상태에서 메소드를 종료하는 경우 파일 리소스가 제대로 해제되지 않고 메모리에 계속 남아있게 됩니다.
- 캐시 관리: 캐시를 사용할 때, 캐시에 추가된 객체들이 더 이상 필요하지 않는 상황에서도 캐시에 계속 유지되면 메모리 누수가 발생할 수 있습니다.
예를 들어, 다음과 같은 상황에서 메모리 누수가 발생할 수 있습니다.
public class CacheLeakExample {
private Map<String, Object> cache = new HashMap<>();
public void addToCache(String key, Object obj) {
cache.put(key, obj);
}
public void removeFromCache(String key) {
cache.remove(key);
}
}
위의 예시에서는 addToCache
메소드를 통해 캐시에 객체를 추가하고, removeFromCache
메소드를 통해 캐시에서 제거할 수 있습니다. 하지만 캐시에서 제거된 객체의 참조가 아직 필요한 경우에도, 이 객체는 계속 메모리에 유지됩니다.
이러한 메모리 누수를 방지하기 위해서는 참조를 올바르게 해제하고, 리소스를 정확하게 해제하는 등 메모리 관리에 대한 주의가 필요합니다.