SORU
10 Mart 2010, ÇARŞAMBA


Neden Sistem çağrısı için kötü bir uygulamadır.() gc?

Sonra answering Bir soru nasıl force-free objects in Java (adam oldu takas 1.5 GB HashMap) System.gc() söylendiğine kötü uygulama arama System.gc() el ile, ama henüz bir yorum değil, tamamen ikna edici. Buna ek olarak, hiç kimse upvote için cesaret, ne de benim cevap downvote gibiydi.

Bana bu kötü uygulama, ama sonra ben de söyledim o çöp toplayıcısını çalıştırır değil sistematik durdurun dünyayı artık, ve bu da etkili bir şekilde kullanılabilir tarafından JVM sadece bir ipucu, bu yüzden ben de kayıp.

JVM genellikle belleği geri kazanmak için gereken zaman senden daha iyi bildiğini anlıyorum. Ben de veri hakkında birkaç kilobayt endişe aptalca olduğunu anlıyorum. Ben de bile veri megabayt birkaç yıl önce ne olmadığını anlamak. Ama hala, 1,5 gigabayt? Ve senbiliyorumveri bellekte etrafında asılı gibi 1.5 GB var; karanlıkta bir ihtimal gibi değil. System.gc() sistematik olarak kötü veya iyi olur bir nokta varmıdır?

Yani soru aslında çift

  • Neden veya System.gc() aramak için kötü bir uygulama değil mi? Gerçekten sadece bazı uygulamaları kapsamında JVM için bir ipucu mu, yoksa her zaman tam toplama bir döngüdür? Gerçekten dünya durmadan hızlı bir şekilde bu çöp toplayıcı uygulamaları var mı? İnsanlar benim için yorumlar answer yapmış, çeşitli iddialar üzerinde biraz ışık tutmak lütfen.
  • Eşik noktası neresi? Olduaslaaramak için iyi bir fikir 4**, ya da kabul edilebilir olduğu zamanlar. Eğer öyleyse, o zamanlar neler?

CEVAP
10 Mart 2010, ÇARŞAMBA


Herkes her zaman System.gc() önlemek için diyor nedeni olmasıdırtemelden bozuk bir kod çok iyi göstergesi. Doğruluğu için bağlı herhangi bir kod kesinlikle kırık; performans için kullanan tüm büyük ihtimalle kırık vardır.

Altında çalışan ne olduğunu bilmiyorsun. Kesinlikle bazı vardır< . em ^"durdurun dünyayı"eğer iddia olarak, ama bazı Jvm'ler o kadar zeki değil ya da çeşitli nedenlerle (belki de bir telefon mu aldılar?) yapma. Ne yapacağını bilmiyorsun.

Ayrıca, hiçbir şey garanti değil. JVM sadece tamamen kendi isteği görmezden gelebilir.

Bu arada "ne olduğunu bilmiyorsunuz, öyle mi," "bilmiyor musun, Eğer onu bile Yardım" ve "yapmamalısın arayayım yine de" neden insanlar bu kadar güçlü diyerek bu genellikle olmamalı diyoruz. Bir durumda olduğunu düşünüyorum "eğer bu kullanarak olmalıdır olup olmadığını sormak gerekirse, içmemelisin"


EDİTdiğer iplik birkaç endişeleri gidermek için:

Sana bağlı bu konuyu okuduktan sonra, işaret etmek istediğim birkaç şey daha var. İlk olarak, birisi gc() arama sistemi bellek döndürebilir önerdi. Bu kesinlikle doğru olmak zorunda - Java ayırma bağımsız olarak kendisi büyür, Java yığını değil.

Gibi, JVM bellek (megabayt birçok on) basılı tutun ve gerektiği gibi öbek büyüyecek. Mutlaka Java nesneleri ücretsiz bile sistem için bellek geri gelmez; tamamen ayrılmış bellek üzerinde tutmak için özgür geleceği Java ayırma için kullanılacak.

System.gc() hiç bir şey yapmıyor bunun mümkün olduğunu göstermek için, Görünüm:

http://bugs.sun.com/view_bug.do?bug_id=6668279

ve özellikle -XX:DisableExplicitGC VM bir seçenek var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DavidParody

    DavidParody

    17 EKİM 2009
  • Kiddyzuzaa

    Kiddyzuzaa

    25 ŞUBAT 2014
  • Orson Wang

    Orson Wang

    28 EKİM 2006