Perl6의 쓰레기 수집

참조 개수
perl 5에서 참고 계수를 통과합니다.Perl 5에서 무언가를 만들 때 인용 계수가 1 이상이므로 활력을 유지합니다.가장 간단한 경우 다음과 같습니다.

# reference count of $a = 1, because lives in lexical pad
# lexical pad is gone, reference count to 0
Perl 5에서 값이 객체인 경우 DESTROY 메서드가 호출됩니다.

Foo->
# $a->DESTROY called
만약 외부 자원과 관련이 없다면, 제때에 없애는 것은 관리자가 사용하는 메모리의 다른 방식일 뿐이다.프로그래머로서 어떻게 회수될지, 언제 회수될지 신경 쓸 필요가 없다.그럼에도 불구하고 만약에 외부 자원, 예를 들어 데이터베이스 핸들 (데이터베이스 서버가 제공하는 데이터베이스 핸들은 통상적으로 유한한 수량만 있다) 을 처리해야 한다면 제때에 없애는 것은 매우 좋은 특성이다.참고 계수는 이 점을 제공할 수 있다.
그러나 인용 계수는 몇 가지 단점이 있다.그것은perl5 핵심 개발자를 채택했다.여러 해가 지나야 참고 계수가 정상적으로 작동할 수 있다.만약 당신이 Xs를 일하고 있다면, 메모리 유출이나 조기 파괴를 방지하기 위해 인용 계수를 알아야 합니다.
다중 스레드 환경에서 동기화를 유지하는 것은 더욱 어려워집니다. 여러 스레드에서 인용된 업데이트를 동시에 잃어버리지 않기를 원하지 않기 때문입니다. 메모리 유출과/또는 외부 자원이 방출되지 않기 때문입니다.이런 상황을 피하기 위해서는 어떤 잠금이나 원자 업데이트가 필요하다. 둘 다 싸지 않다.
  • 퍼블릭 5 ithread는 해석기 사이에 공유되지 않은 메모리가 있는 것 같지만 C 같은 프로그래밍 언어의 라인이 아니므로 인용 계수에 대한 잠금이 필요하지 않습니다
  • 인용 계수는 두 대상이 서로의 인용을 포함한다면 상대방의 인용 계수를 0 이상으로 유지하기 때문에 영원히 삭제되지 않을 것이다.실천에서 이것은 왕왕 더욱 깊이 들어가야 한다. 예를 들어 A->B->C->A와 같다. 그 중에서 A, B와 C는 모두 서로의 생존을 유지하고 있다.
    a의 개념 약한 참고는 Perl 5의 이런 상황을 피하기 위해 개발된 것이다.이것은 순환 인용 문제를 수정할 수 있지만, 순환 인용 (찾기) 문제를 먼저 해결하는 것이 아니라 성능적 의미를 가진다.어떤 약한 인용이 가장 좋은 방식으로 사용할 수 있는지 알아야 한다.그렇지 않으면 불필요한 조기 대상 소각을 받을 수 있습니다.
    가달성 분석
    Perl 6의 핵심은 다중 라인이기 때문에 초기 단계에서 인용 계수를 결정하여 성능과 유지보수에 문제가 있었다.반대로 더 많은 메모리가 필요할 때 대상은 메모리에서 쫓겨난다.및 객체를 안전하게 제거할 수 있습니다.
    Perl 6에서는, Perl 5에서와 같이 DESTROY 방법을 만들 수 있습니다.근데 넌언제 (있으면) 호출될지 확정할 수 없습니다.
    Perl 6의 대상은 쓰레기 수집 실행이 시작될 때만 삭제됩니다. 예를 들어 일정한 메모리 제한에 도달했을 때입니다.오직 이렇게 해야 합니다. 메모리에 있는 다른 대상이 한 대상에 더 이상 접근할 수 없고 DESTROY 방법이 있다면, 대상이 제거되기 전에 호출됩니까?
    프로그램이 종료되면 Perl 6는 쓰레기 수거를 하지 않습니다.LEAVE 및 END 와 같은 위상 지정자는 GET 호출되지만 단계 프로그램에서 실행되는 코드 (간접) 에서 시작하는 쓰레기 수집 외에는 쓰레기 수집이 수행되지 않습니다.
    만약 프로그램이 사용하는 외부 자원(예를 들어 데이터베이스 핸들)을 질서정연하게 닫아야 한다면, 비트레이터를 사용하여 정확하고 신속한 방식으로 외부 자원을 방출할 수 있습니다.
    예를 들어, 프로그램이 종료될 때 (어떤 이유로든) 데이터베이스와의 연결을 올바르게 끊기 위해 END 위상자(Perl 5에서) 를 사용할 수 있습니다.
    
    DBIishconnect "Couldn't connect"
    END disconnect
    END 위상자에는 블록이 필요하지 않습니다(예: {...})Perl 6에서없으면, 위상기의 코드는 주위의 코드와 문법 블록을 공유합니다(Lexpad).
    위의 코드는 프로그램이 종료되기 전에 데이터베이스 연결이 설정되었거나 데이터베이스 연결이 어떤 이유로 실패하면 호출을 시도할 수 있는 결함이 있습니다.disconnect 방법의 모든 내용입니다. $dbh, 이것은 실행 오류를 초래할 수 있습니다.그곳은 그러나perl6에서 이런 상황을 피할 수 있는 간단한 성어가 있다.쓰다END disconnect with  
    접두사 with 는 주어진 값(일반적으로 실례화된 대상)을 정의하고 테마를 $_...disconnect 는 약어입니다. $_.disconnect.
    언제든지 외부 자원을 정리하고 싶으면 범위가 종료되면 LEAVE 범위 내의 위상을 사용할 수 있습니다.
    
    DBIishconnect -> 
      LEAVE disconnect # no need for `with` here
      # do your stuff with the database
    say "Could not do the stuff that needed to be done"
    역할 영역이 왼쪽이면 LEAVE 위상자가 실행됩니다.따라서 코드가 이 범위 내에서 실행될 때마다 데이터베이스 자원이 방출된다.
    요약
    비록 퍼블릭 6가 퍼블릭 5 사용자 습관의 대상을 제때에 삭제하지 않았지만, 그렇습니까?Perl 5와 같은 외부 자원의 관리를 확보하기 위해 사용하기 쉬운 대체 방법이 있습니다.
    총결산
    이상은 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 대해 일정한 참고 학습 가치를 가지기를 바랍니다. 여러분의 지지에 감사드립니다.더 많은 내용을 알고 싶으면 아래 링크를 보십시오

    좋은 웹페이지 즐겨찾기