나는 조슈아 블로흐 (Joshua Bloch) 서적에서 정리 방법을 재정의하면 할당 및 메모리 수집이 430 배로 증가 할 수 있다고 들었습니다.finalize 메서드를 재정의하면 할당 단계를 늘릴 수있는 이유는 무엇입니까?
메모리를 확보하기 위해 gc에 대한 추가 반복이 필요하기 때문에 메모리 수집이 더 느리게 작동한다는 것은 분명합니다.
하지만 왜 할당 단계를 늘릴 수 있습니까?
나는 조슈아 블로흐 (Joshua Bloch) 서적에서 정리 방법을 재정의하면 할당 및 메모리 수집이 430 배로 증가 할 수 있다고 들었습니다.finalize 메서드를 재정의하면 할당 단계를 늘릴 수있는 이유는 무엇입니까?
메모리를 확보하기 위해 gc에 대한 추가 반복이 필요하기 때문에 메모리 수집이 더 느리게 작동한다는 것은 분명합니다.
하지만 왜 할당 단계를 늘릴 수 있습니까?
나는 원래 문 검색 한 : 내 컴퓨터에
는 단순한 객체를 생성하고 파괴하는 시간은 약 5.6 NS입니다. 파이널 라이저를 추가하면 2,400 ns의 시간이 증가합니다. 즉 finalizers를 사용하여 객체를 만들고 파괴하는 것이 약 입니다.
이것은 일반 성명은 아니지만 숫자가 재현 될 수있는 패턴이 아니라는 것을 나타내는 증거 보고서 일뿐입니다. 이 요소는 그렇게 단순하지 않은 객체를 사용하거나 그 중 많은 것을 사용할 때 변경 될 수 있습니다.
물론 이러한 비용은 최종 마무리가 실제로 구현되는 방식에 따라 다릅니다. HotSpot에서는 finalize()
메서드가있는 객체를 만들 때마다 Finalizer.register
메서드를 호출하여 Finalizer
의 인스턴스가 만들어집니다.
두 개의 오브젝트를 할당하는 것보다 비용이 많이들 것입니다. 이 Finalizer
인스턴스는 강력하게 연결되며 이는 Finalizer
인스턴스 자체의 수집을 방지하는 데 필요하며 생성 된 개체에 대한 참조를 포함합니다. 다시 말해, 객체 할당이 처음에 어떻게 로컬 이었는지에 관계없이 새로운 객체는 이으로 이스케이프되어 이후의 많은 최적화 작업을 방해합니다.
"파괴"에 관해서는, 일반적인 목표를 개심 케하는 것은 아무 일도하지 않는다. 아무런 조치도 취할 수 없으며 도달 할 수없는 개체를 사용하여 수행 할 수 없습니다. 에 연결할 수 없으므로입니다. 특정 도달 가능성 상태는 도달 가능한 Reference
개체 (위에서 언급 한 Finalizer
개체)를 만나는 경우에만 발생할 수 있습니다. 개체는 다른 개체 (예 : 다른 일반적인 참조를 통해 발견되지 않은 개체)에 대한 참조를 보유합니다. 그러면 Reference
개체가 될 수 있습니다. 대기열에 넣은 다음 종료 자 스레드가 적절한 조치를 취할 수 있습니다.
물론 "조치 없음"을 다른 조치와 비교하면 임의의 요소가 발생할 수 있습니다. 절대 숫자는 2,400ns입니다. 객체를 큐에 넣고 대기열을 폴링하도록 다른 스레드에 알리는 작업과 관련하여 합리적입니다.
먼저 해당 주제에 대한 조사를 수행하고이 항목에 대한 * * * e 2000 년 정도. 가장 유명한 것으로 Block이 일한 것은 과거 15 년과 같다고 생각하십시오. ** 그 이후로 많은 자바 플랫폼에서 ** 일어났습니다. – GhostCat
할당이 더 비싼 이유는 모르겠다. 클린업은 오브젝트를 작성하여 오브젝트를 완료 대기열에 추가합니다. –
중요하지 않은'finalize()'오버라이드에 의해 유발 된 GC 사이클을 기다려야하기 때문에 할당 시간이 더 오래 걸릴 수 있습니다. –