[java] 자바 메모리 누수의 종류는 어떤 것들이 있나요?
  1. 객체 참조 유지 - 객체를 사용한 후에도 더 이상 사용하지 않지만, 여전히 참조로 유지되는 경우입니다. 이는 예를 들어, 어떤 컬렉션에 객체를 추가한 뒤 해당 객체를 제거하지 않는 경우에 발생할 수 있습니다.

예시:

List<SomeObject> list = new ArrayList<>();
SomeObject obj = new SomeObject();
list.add(obj);
// obj를 사용한 후 제거하지 않으면 메모리가 누수될 수 있음
  1. 리소스 누수 - 입출력 스트림, 데이터베이스 커넥션, 네트워크 연결과 같은 리소스를 적절하게 닫지 않아 메모리 누수가 발생하는 경우입니다. 이는 선행 작업이나 후속 작업이 필요한 경우 발생할 수 있습니다.

예시:

InputStream in = null;
try {
    in = new FileInputStream("file.txt");
    // 입력 스트림을 사용한 작업 수행
} catch (IOException e) {
    // 예외 처리
} finally {
    // try 블록 완료 후에도 스트림을 닫지 않으면 메모리가 누수될 수 있음
    if (in != null) {
        in.close();
    }
}
  1. 스레드 누수 - 스레드를 적절하게 종료하지 않아 스레드가 계속해서 실행되는 경우입니다. 이는 스레드 풀을 사용하는 경우에 주로 발생할 수 있습니다.

예시:

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(new Runnable() {
    @Override
    public void run() {
        // 작업 수행
    }
});
// 작업을 완료하지 않고 ExecutorService를 종료하지 않으면 스레드가 계속 실행되므로 메모리가 누수될 수 있음

메모리 누수는 심각한 문제로, JVM이 자동으로 메모리를 관리하지만 개발자가 적절한 자원 해제를 해야 합니다. 따라서 개발 시에는 객체 참조를 적절하게 관리하고, 리소스를 올바르게 닫아 메모리 누수를 방지해야 합니다.

참고 자료: