[java] 자바 메모리 누수란 무엇인가요?

자바는 가비지 컬렉터(Garbage Collector)라는 메모리 관리 기능을 제공하여 더 이상 사용되지 않는 객체를 자동으로 감지하고 해제합니다. 하지만 메모리 누수는 가비지 컬렉터가 동작하지 않는 경우에 발생할 수 있습니다. 주로 다음과 같은 상황에서 메모리 누수가 발생합니다.

  1. 객체 참조 해제를 잊은 경우: 객체를 생성했지만, 더 이상 참조하지 않으면 참조를 해제해야합니다. 만약 참조를 해제하지 않은 상태로 객체를 계속 사용하는 경우, 가비지 컬렉터는 해당 객체를 해제하지 않으며 메모리 누수가 발생합니다.

예를 들어, 아래 코드에서는 List 객체를 생성한 후 add() 메소드로 요소를 추가합니다. 그러나 remove() 메소드로 요소를 제거하지 않으므로 리스트는 계속해서 메모리를 사용하게 됩니다.

List<String> list = new ArrayList<>();
list.add("example");
// remove() 메소드를 호출하지 않음
  1. 리소스 해제를 제대로 처리하지 않은 경우: 자바에서는 파일이나 데이터베이스 연결과 같은 외부 리소스 사용 시, 명시적으로 해제해주어야 합니다. 하지만 리소스를 제대로 해제하지 않으면 해당 리소스가 계속해서 메모리를 점유하게 되어 메모리 누수가 발생합니다.

아래 코드에서는 FileReader를 사용하여 파일을 읽고, 읽은 내용을 출력합니다. 그러나 파일을 닫는 close() 메소드를 호출하지 않으므로 FileReader 객체가 계속해서 메모리를 점유하게 됩니다.

try {
    FileReader reader = new FileReader("example.txt");
    // 파일을 읽고 출력하는 로직
} catch (IOException e) {
    e.printStackTrace();
}
// close() 메소드 호출을 잊음

메모리 누수를 방지하기 위해서는 객체 참조를 해제하고, 리소스를 올바르게 관리해야 합니다. 객체 참조 해제를 위해서는 객체를 더 이상 사용하지 않을 때 null로 할당하거나, 적절한 시점에 계속 참조되지 않도록 코드를 수정해야 합니다. 리소스 해제를 위해서는 객체 사용 후에는 명시적으로 close() 메소드를 호출하거나 try-with-resources 문을 사용하여 자동으로 리소스를 해제할 수 있습니다.

메모리 누수는 성능 저하와 메모리 부족 등 심각한 문제를 일으킬 수 있으므로, 주의해야 합니다. 따라서 프로그램을 개발할 때 메모리 누수에 대해 주의하고, 적절한 메모리 관리를 해야합니다.

참고 자료: