Ruby'de tüm sınıflar Class sınıfının nesneleridir. Sınıflar da nesneler olduğundan, bir Ruby VM sınıf nesneleri için aynı Çöp Toplama stratejisini izler mi? Bir sınıf nesnenin çöp toplama için güvenli olduğunu belirleyen nedir?Ruby Class nesne çöp toplama
22
A
cevap
0
Nesneye bağlanan hiçbir şey olmadığında, ondan kurtulmak güvenlidir. - Çöp toplama işlemi bittiğinde, bu benim bilgimin ötesinde.
0
Cevabın ne olduğu hakkında hiçbir fikrim yok, ama deneylerle öğrenemiyor musunuz? pickaxe'a bir göz atın. Bunun çok naif bir testtir ve birisi daha iyi yapabilirim eminim, ama fikir olsun:
puts "program start"
include ObjectSpace
class SfbdTest
def initialize(a)
@a = a
end
end
define_finalizer(SfbdTest, proc{|id| puts "GC on class"})
puts "creating instance"
x = SfbdTest.new(1)
define_finalizer(x, proc{|id| puts "GC on instance"})
puts "zombie-ing instance"
x = nil
puts "forcing GC"
GC.start()
puts "program end"
üretir: Bir iş parçacığı ihtiyacı olduğu gibi
[email protected]:~$ ruby -w test.rb
program start
creating instance
zombie-ing instance
forcing GC
program end
GC on instance
GC on class
[email protected]:~$
görünüyor, ama ne yazık ki Çalışmam gerekiyordu, özür dilerim ...
1
Bunu test ettim, cevap öyle görünüyor.
irb(main):001:0> x = [] #Memory Usage = 12MB
=> []
irb(main):002:0> 120000.times {x << Class.new} #Memory usage now at 41 MB
=> 120000
irb(main):013:0> x = []
=> []
irb(main):011:0> GC.start() #Memory usage now at 13MB
=> nil
12
Daha da somut bir örnek, Andrew Cholakian'ın yanıtına benzer bir şekilde ObjectSpace kullanmaktır. Örneğin:
2.1.1 :001 > ObjectSpace.count_objects[:T_CLASS]
=> 884
2.1.1 :002 > 10000.times { Class.new }
=> 10000
2.1.1 :003 > ObjectSpace.count_objects[:T_CLASS]
=> 20884
2.1.1 :004 > GC.start
=> nil
2.1.1 :005 > ObjectSpace.count_objects[:T_CLASS]
=> 884
Bu anonim sınıfları (her yerde sabit kaydedilmez ya da o sınıfların herhangi örnekleri tarafından kullanılan) gerçekten çöp toplanan alırım göstermektedir.
İlgili konular
- 1. Ruby: Çöp toplama için bir nesneyi işaretleme
- 2. Özürlü Çöp Toplama Bildirimleri
- 3. Çöp toplama ve yansıma
- 4. Çöp toplama, java
- 5. Statik üyelerin çöp toplama
- 6. nodejs çöp toplama çıkışı
- 7. Python'da manuel çöp toplama
- 8. C# çöp toplama nasıl azaltılabilir
- 9. Ruby'de çöp toplama profili nasıl yapılır
- 10. Çöp Toplama yerel değişkeni kaldırmadı
- 11. Çöp toplama ve saklama kutusu
- 12. javascript anonim işlev çöp toplama
- 13. newLISP çöp toplama kullanıyor mu?
- 14. yeni Konu() ve Çöp Toplama
- 15. Java 8 metaspace çöp toplama
- 16. Dairesel Nesne ile Ruby Garbarge Koleksiyonu Referanslar
- 17. node js çöp toplama/bellek sorunları krom
- 18. Son derece uzun çöp toplama süreleri
- 19. İzole döngüsel referanslarla çöp toplama davranışı?
- 20. Durdurulan Hizmet Sabit Çöp Toplama İşlemi Yapıyor
- 21. Çöp Toplama neden bu kadar yavaş?
- 22. Arka plan işçi ve çöp toplama?
- 23. Nesne [] Class [] Java
- 24. DotTrace Performance Profiler [Çöp toplama] ile ne ifade ediyor?
- 25. Tarihlerden toplama ortalama tarih (Ruby)
- 26. Android JNI yerel kod C++ nesneleri çöp toplama çağırmak mı?
- 27. CLR çöp toplama metodolojisi, etrafında dairesel nesne referansları atmanın güvenli olduğu anlamına mı geliyor?
- 28. Tam çöp toplama .NET 4.x'te nasıl zorlanır?
- 29. ReactiveUI bağlantıları, çöp toplama işleminin oluşmasını engelliyor gibi görünüyor.
- 30. CDI Uygulama ve Bağımlı kapsamlar çöp toplama etkisini etkileyebilir mi?
Bu genel olarak doğrudur, ancak sınıflar özel bir durum olarak görülebilir. Örneğin, bir sınıfın bir örneği yoksa ve başka bir sınıf tarafından alt sınıflanmamışsa, 'bağlantılar' yoktur (sizin de söylediğiniz gibi), ancak GC için gerçekten güvenli midir? Ya birisi daha sonraki bir tarihte bundan bir örnek oluşturmak isterse. Durumun, siz çıktıkça sınıflar için net bir kesim olduğunu düşünmüyorum :) – horseyguy
@banister: Tam olarak, bir GC'nin bir sınıf nesnesini özel bir alanda tedavi etmesi gereken diğer özel durumlar arasında belirtmek istediğim durum tam da budur. yol –
Yeterince adil. Bir sınıf, sabit bir şey değil, değil mi? Ve bir sabitten kurtulamazsınız, çünkü ortam tamamlanıncaya kadar bir ortamda (IRB'nin 'ana' nesnesi veya çalışma zamanı olsa bile) bir değişkendir. "class String", "String = Class.new" ile aynı şeydir. – Trevoke