[java] 리소스를 올바르게 닫지 않음으로써 발생하는 메모리 누수 예시는 어떤 것들이 있나요?
- 파일 입출력: 파일을 열면, 파일을 닫아야 합니다. 파일을 닫지 않으면 파일 핸들러가 계속해서 메모리를 점유하게 되어 메모리 누수가 발생할 수 있습니다.
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
// 파일을 사용하는 로직
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 데이터베이스 연결: 데이터베이스 연결은 해제되지 않으면 메모리 누수가 발생할 수 있습니다. 데이터베이스 연결을 사용한 후에는 반드시 연결을 닫아야 합니다.
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db");
// 데이터베이스 작업 수행
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 스레드 사용: 스레드를 실행한 후에는 스레드를 종료해야 합니다. 스레드를 종료하지 않으면 해당 스레드의 리소스가 계속해서 점유되어 메모리 누수가 발생할 수 있습니다.
Thread thread = new Thread(() -> {
// 스레드 작업 수행
});
thread.start();
// 스레드 종료
thread.interrupt();
- 그 외 자원 사용: 자원을 사용한 후에는 반드시 자원을 닫아야 메모리 누수를 방지할 수 있습니다. 예를 들어, 네트워크 연결, 소켓, 스트림 등의 자원을 사용한 후에는 반드시 해당 자원을 닫아야 합니다.
Socket socket = null;
try {
socket = new Socket("localhost", 8080);
// 네트워크 통신 작업 수행
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
리소스를 사용한 후에는 finally 블록을 사용하여 리소스를 닫는 것이 좋습니다. 이를 통해 예외 발생 시에도 리소스 닫힘을 보장할 수 있습니다.