Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

가비지 컬렉션 소개(1부)

코드를 실행할 때마다 메모리를 사용합니다. Ruby와 같은 언어로 작성하면 사용할 수 있는 메모리가 무한한 것처럼 보입니다. 코드를 실행하는 시스템의 고정 메모리 양에 대해 생각하지 않고 계속 진행할 수 있습니다. 이 Ruby Magic 에피소드에서 우리는 이것이 어떻게 작동하는지 설명할 것입니다!

약간의 역사

당시에는 Ruby와 같은 스크립팅 언어가 아직 존재하지 않았습니다. 사람들은 저수준 프로그래밍 언어인 C와 같은 언어로만 코드를 작성했습니다. 이러한 언어를 낮은 수준으로 만드는 것 중 하나는 스스로 정리해야 한다는 것입니다. 예를 들어 String을 저장하기 위해 메모리를 할당할 때마다 , 정리할 시기를 결정해야 합니다.

수동 정리

이것은 다음과 같은 모의 Ruby 코드와 비슷합니다. 변수를 선언하고 free 메서드를 사용합니다. – 이 메소드는 Ruby에 실제로 존재하지 않습니다 – 변수를 사용한 후 사용한 메모리를 정리합니다.

1_000_000.times do |i|
  variable = "Variable #{i}"
  puts variable
  free(variable)
end

지루한 프로그래밍 방식

여기에 위험이 있음을 이미 깨달았을 수도 있습니다. free를 잊어버리면 어떻게 되나요? 변수? 이 경우 해당 변수의 내용은 프로세스가 종료될 때까지 메모리에 그대로 남아 있습니다. 이 작업을 충분히 자주 수행하면 메모리가 부족하고 프로세스가 충돌합니다.

다음 예는 또 다른 일반적인 문제를 보여줍니다.

1_000_000.times do |i|
  variable = "Variable #{i}"
  free(variable)
  puts variable
end

변수와 free를 선언합니다. 그것. 그러나 우리는 그것을 다시 사용하려고 합니다. 그것은 더 이상 존재하지 않기 때문에 불가능합니다. 이것이 C라면 이제 프로그램이 segfault로 충돌합니다. . 이런!

인간은 실수 기계입니다

인간은 항상 이런 종류의 실수를 저지르지 않는 것으로 악명이 높습니다. 따라서 자동으로 메모리를 정리하는 방법이 필요합니다. Ruby에서도 사용되는 가장 인기 있는 방법은 가비지 컬렉션(GC)입니다.

가비지 컬렉션(GC) 작동 방식

GC를 사용하는 언어에서는 수동으로 정리하지 않고도 개체를 만들 수 있습니다. 개체를 만들 때마다 Garbage Collector에 등록됩니다. GC는 이 개체에 대한 모든 참조를 추적하려고 합니다. 개체를 더 이상 사용하지 않는다고 판단되면 정리 대상으로 표시됩니다. 때때로 Garbage Collector는 프로그램을 일시 중지하고 표시된 모든 개체를 정리합니다.

몇 가지 예 보기

이전에 사용한 간단한 루프에서 GC의 작업은 상당히 쉽습니다. 루프가 반복될 때마다 변수는 더 이상 어디에도 사용되지 않습니다. 변수를 즉시 정리하도록 표시할 수 있습니다.

1_000_000.times do |i|
  variable = "Variable #{i}"
  puts variable
end

다음 예제에서는 변수를 puts_later에 전달합니다. 30초 동안 기다린 다음 puts하는 메소드 변수.

def puts_later(variable)
  Thread.new do
    sleep 30
    puts variable
  end
end
 
1_000_000.times do |i|
  variable = "Variable #{i}"
  puts_later variable
end

Garbage Collector의 작업은 이 비교적 간단한 예에서 이미 상당히 복잡합니다. puts_later에서 변수를 참조한다는 것을 이해해야 합니다. 방법. 메서드가 스레드를 시작하기 때문에 가비지 수집기는 스레드를 추적하고 완료될 때까지 기다려야 합니다. 그래야만 변수를 정리하도록 표시할 수 있습니다.

복잡할 때

복잡한 예에 들어가지 않고 Garbage Collector의 작업이 정말 어렵다고 말할 때 저를 믿으십시오. 이것은 또한 GC가 프로덕션 환경에서 오버헤드와 문제를 일으킬 수 있는 이유를 설명합니다. 메모리를 적절하게 지우려면 프로그램에서 무슨 일이 일어나고 있는지 매우 자세히 이해해야 합니다. 메모리를 올바르게 지우려면 꽤 많은 CPU 주기가 필요합니다. 하지만 자기 자신을 정리하는 것보다 낫습니다!

가비지 컬렉션에 더 많은 기능이 있습니다.

이것은 Garbage Collection에 대한 소개에 불과했습니다. 향후 기사에서는 이것이 Ruby에서 정확히 어떻게 작동하는지, 그리고 애플리케이션의 성능을 개선하기 위해 GC를 측정하고 조정하는 방법을 살펴볼 것입니다.

업데이트: 다음 에피소드는 여기에서 볼 수 있습니다.