저번 포스팅에서도 다루었지만
C,C++과 JAVA의 많은 차이 중 두드러지는 것 하나가 쓰레기 수집가(GC)입니다.
C,C++ 에서는 잘 다루면 어마어마한 효율을 보여주지만, 못다루면 주된 버그의 원인이 되는
주소값 관리를 자바에서는 GC 알고리즘을 통해 다루어 줍니다.
과거에는 자바의 쓰레기 수집가 알고리즘이 지금만큼 뛰어나지 못해
문제가 된 적이 있지만, 지금은 많이 향상되었다고 합니다.
public static void main(String[] args){
System.runFinalization();
System.gc();
}
자바에서 GC를 호출하는 방법입니다.
GC는 JVM마다 호출되는 시점이 다르고, 메모리의 여유상황에 영향을 받기 때문에
제어하기 힘든데, 이 명령어를 쓰면 호출을 간접적으로 요청할 수 있습니다.
다만, 호출을 한다고 C나 C++ 처럼 즉각적으로 실행되지 않습니다.
어떤 객체에 대한 모든 참조가 사라지고나서 호출 하더라도, 실제로 지워지기 까지는 많은 시간이 걸릴 수 있습니다.
때문에 중요 상태 정보를 GC 호출을 통해 갱신하게 하면 안됩니다.
System.gc나 SystemrunFianlization()의 문제점은 언제나 모든 메모리를 탐색한다는 것입니다.
이 작업은 굉장히 많은 자원을 소모하고, 시간이 오래걸리는 작업입니다.
반면 JVM이 이를 맡아서 할 경우에는 메모리의 흐름을 보고 부분적/전체적 쓰레기를 수집하여
효율적으로 메모리를 반환하려 시도합니다.
최신 JVM은 프로그램을 만든 프로그래머보다 더욱 더 객체를 더 잘 다루기 때문에
인위적으로 종료자를 호출하는 것은 피하는 것이 좋습니다.
그러면 파일이나 스레드처럼 명시적으로 반환하거나 삭제해야하는 자원을 포함하는 객체의 클래스는 어떻게 작성하는 걸까요?
그냥 명시적인 종료 메소드를 사용하면 됩니다.
대표적으로 outputStream이나 InputStream이 있습니다.
이러한 메소드는 일반적으로 try catch finally와 사용하게 되는데,
이는 자원을 관리하기 위함입니다.
close 메소드를 통해 종료해주면 됩니다.
Foo foo = new Foo(...);
try{
...
} finally {
foo.terminate();
// or foo.close();
}
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법 (0) | 2018.02.03 |
---|---|
이펙티브 자바 규칙 6 - 유효기간이 지난 객체는 폐기하자 (0) | 2018.01.30 |
이펙티브 자바 규칙 5 - 불필요한 객체 만들지 않기 (0) | 2018.01.28 |