2014-09-14 61 views
11

işliyor Scala'da bir çok eşzamanlı iş parçacığı ve sistem çağrısı var. Bu sistemin bir problemi var çünkü hafıza kullanımı zamanla artıyor.Scala'da bellek sızıntısı var ve

Görüntü körüğü bir gün için bellek kullanımını gösterir. Limite ulaştığında süreç kapanıyor ve tekrar kurtarmak için bir bekçi köpeği koydum. inserir a descrição da imagem aqui

Ben periyodik komutunu

jcmd <pid> GC.run 

çalıştırmak Ve bu bellek yavaş yavaş artmaya yapar, ama kaçak hala olmuyor.

jvisualvm ile analiz ettim, zaman içinde farklı anlarla karşılaştırarak, 40 dakika delta. Görüntü körüğü, bu iki anın zaman içindeki karşılaştırmasını gösterir. ConcurrentHashMap$HashEntry,, WeakReference, char[] ve String gibi bazı sınıfların örneklerini ve scala.collection.concurrent paketindeki birçok sınıf için bir artış olduğuna dikkat edin.

bellek sızıntısına neden olabilir ne

memory leaked ojects

?

Düzenleme 1: JVisualVM incelenmesi , bunu sbt.TrapExit $ App sınıf içinde instanced edilir TriedMap içindedir CNode ve INode sınıfların nesne ettim. İşte nesne hiyerarşisi rakamdır:

object hierarchy

+1

http://stackoverflow.com/questions/1218872/avoiding-scala-memory-leaks-scala-constructors?rq=1 http://stackoverflow.com/questions/7944148/weakreference-and-memory-leaks http : //stackoverflow.com/questions/3871960/long-lived-java-weakreferences – Tony

+0

List.toStream.map'i görüyorum, ama scala.collection.concurrent nereden geliyor? "Çok fazla ip" derken, "foo.par" kelimesini çok mu kastediyorsunuz? Paralel koleksiyonlarda uzman olarak sormuyorum. Açıkça bir TrieMap kullanıyor musunuz? –

+0

Çok fazla iş parçacığı Yüzlerce oyuncu olduğu anlamına gelir, her bir oyuncu sistem çağrıları yapar ve görevleri eşzamansız yürütmek için bazı gelecekler oluşturur. Ben açıkça TrieMap kullanmıyorum. –

cevap

1

İlk yakalama bir yığın dökümü vadesi geldiğinde hafıza sorunu dışı bir şekilde uygulama çöker. Eğer bellek sızıntı kaynağını anlamaya yığın dökümü analiz etmek gerekir Jvm

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump 

Sonraki başlatırken aşağıdaki bayraklarını ekleyin. Eclipse MAT'u kullanmanızı öneririz. Leak Suspects raporu size hangi nesnelerin sızmasına neden olduğuna dair bir fikir vermelidir. Uygulamayı görmeden söylemesi zor olan

+0

Yığın diffs ile, zaten sızıntı kaynağının ne olduğu hakkında bir fikrim var. ConcurrentHashMap $ HashEntry sayıları artıyor. Ancak bu nesneleri kodumda kullanmıyorum, bu yüzden scala veya jvm içinde bir şey gibi görünüyor –

+0

Nesneleri doğrudan taklit etmiyor olabilirsiniz, ancak bu gerçekleşir. Yani, bu nesnelerin nerede/ne zaman nerede oluşturulduğuna dair izlemeye ihtiyacınız var. Böylece, CNode örneğini oluşturur. Bazı nesneler, CNode'a, onu (ve başvurduğu nesnelerin) çöp toplanmasını önleyen bir referansı tutar. Eclipse MAT, bu bilgileri size sunar - http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Ffindingresponsibleobjects.html size bazı bilgiler vermelidir. – rrevo

0

. Gönderinizin başlığı Scala'da bir bellek sızıntısı olduğunu gösterir, ancak uygulamanızı uygulamanızı nesnelerin bırakılmasıyla ilgili sorunlara karşı kontrol ettiniz mi?

  • size hiç aktörlerin sayısını sınırlamak mı:

    aşağıdaki onay mü?
  • Sistem çağrıları için zaman aşımları ayarlıyor musunuz?
  • Bu görevler gerçekleştirildiklerinde oyuncuların Heap'tan kaldırılmasına izin veriyor musunuz?
  • Eğer belleğe sığabilecek ya da sadece jvm

Söylemeye çalışıyorum olmasıdır "ne yapacağını" bilecek umuduyla "aktörler yüzlerce" oluşturarak kaç aktör saymak mü belki de hafızanız biter çünkü daha sonra serbest bırakılmayan birçok nesneye sahip olursunuz, çünkü ya görevlerini yerine getiriyorlar (zaman aşımı yok) ya da çoğunuz için yarattınız.

Belki de uygulamanızı birçok jvms ile ölçeklendirmeniz gerekiyor? Kaç tane jvms kullanıyorsunuz?