logo

자바 파괴자

Java에서는 클래스의 객체를 생성할 때 메모리(힙)의 일부 공간을 차지합니다. 이러한 객체를 삭제하지 않으면 메모리에 남아 프로그래밍 측면에서 올바르지 않은 불필요한 공간을 차지하게 됩니다. 이 문제를 해결하기 위해 우리는 파괴자 . 이 섹션에서는 대체 옵션에 대해 설명합니다. 자바의 소멸자 . 또한, 우리는 또한 사용법을 배울 것입니다 마무리() 메소드를 소멸자로 사용합니다.

그만큼 파괴자 생성자의 반대입니다. 생성자는 객체를 초기화하는 데 사용되는 반면 소멸자는 객체가 차지한 리소스를 해제하는 객체를 삭제하거나 파괴하는 데 사용됩니다.

기억 Java에는 소멸자 개념이 없습니다. . 소멸자 대신 Java는 소멸자와 동일하게 작동하는 가비지 수집기를 제공합니다. 가비지 수집기는 다음에서 실행되는 프로그램(스레드)입니다. JVM . 사용하지 않는 객체(더 이상 사용하지 않는 객체)를 자동으로 삭제하고 메모리를 확보합니다. 프로그래머는 수동으로 메모리를 관리할 필요가 없습니다. 오류가 발생하기 쉽고 취약할 수 있으며 메모리 누수로 이어질 수 있습니다.

Java의 소멸자는 무엇입니까?

객체가 더 이상 사용되지 않을 때 자동으로 호출되는 특수 메서드입니다. 개체의 수명 주기가 완료되면 가비지 수집기는 해당 개체를 삭제하고 개체가 차지한 메모리를 할당 해제하거나 해제합니다.

그것은 또한로 알려져 있습니다 종료자 그것은 비결정적입니다. ~ 안에 자바 , 처리되는 객체의 할당 및 할당 해제 가비지 컬렉터 . 종료자 호출은 암시적으로 호출되므로 보장되지 않습니다.

소멸자의 장점

  • 개체가 점유한 리소스를 해제합니다.
  • 명시적인 호출은 필요하지 않으며 프로그램 실행이 끝나면 자동으로 호출됩니다.
  • 어떤 매개변수도 허용하지 않으며 오버로드될 수 없습니다.

소멸자는 어떻게 작동하나요?

객체가 생성되면 힙의 공간을 차지합니다. 이러한 개체는 스레드에서 사용됩니다. 개체가 더 이상 스레드에서 사용되지 않으면 가비지 수집 대상이 됩니다. 이제 해당 개체가 차지하는 메모리를 생성되는 새 개체에 사용할 수 있습니다. 가비지 컬렉터가 객체를 파괴하면 JRE는 finalize() 메소드를 호출하여 데이터베이스 및 네트워크 연결과 같은 연결을 닫습니다.

위의 내용을 통해 소멸자와 가비지 컬렉터를 사용하는 것은 개발자가 메모리 관리에 간섭하는 수준이라는 결론을 내릴 수 있습니다. 이것이 둘 사이의 주요 차이점입니다. 소멸자는 객체가 언제 소멸될지 정확히 알려줍니다. Java에서는 가비지 수집기가 자동으로 동일한 작업을 수행합니다. 메모리 관리에 대한 이 두 가지 접근 방식은 긍정적인 영향과 부정적인 영향을 모두 갖습니다. 그러나 주요 문제는 때때로 개발자가 메모리 관리에 즉시 액세스해야 한다는 것입니다.

자바 finalize() 메서드

프로그래머가 개체를 파괴하기 위해 가비지 수집기를 강제로 실행하는 것은 어렵습니다. 그러나 Java는 동일한 작업을 수행하는 대체 방법을 제공합니다. Java 객체 클래스는 다음을 제공합니다. 마무리() 소멸자와 동일하게 작동하는 메서드입니다. finalize() 메서드의 구문은 다음과 같습니다.

통사론:

 protected void finalize throws Throwable() { //resources to be close } 

소멸자는 아니지만 추가 보안을 제공합니다. 프로그램을 종료하기 전에 파일 닫기 등과 같은 외부 리소스의 사용을 보장합니다. 메소드 자체를 사용하거나 메소드를 호출하여 이를 호출할 수 있습니다. System.runFinalizersOnExit(true) .

  • java.lang 패키지에 정의된 Object 클래스의 보호된 메소드입니다.
  • 한 번만 호출할 수 있습니다.
  • 메서드를 재정의하려면 finalize() 메서드를 명시적으로 호출해야 합니다.
  • gc()는 Garbage Collector에 의해 실행되는 JVM의 메소드입니다. 힙 메모리가 가득 차서 새로 도착하는 객체에 대해 더 많은 메모리가 필요할 때 호출됩니다.
  • 확인되지 않은 예외를 제외하고 JVM은 finalize() 메서드에서 발생하는 모든 예외를 무시합니다.

소멸자의 예

소멸자Example.java

 public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } } 

산출:

 Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector