Bir .hprof dosyasını nasıl analiz edebilirim?


228

Aşağıdaki bayrakla çalışan bir üretim sunucum var: - XX: + HeapDumpOnOutOfMemoryError

Dün gece sunucumuz bir yığın hatasıyla karşılaştığında bir java-38942.hprof dosyası oluşturdu. Sistem geliştiricilerinin bayrağı bildikleri ortaya çıkıyor, ancak bundan yararlı bilgi almanın bir yolu yok.

Herhangi bir fikir?

Yanıtlar:


215

Eğer oldukça ciddi bir alay yapmak için oldukça gelişmiş bir araç istiyorsanız , Eclipse'deki SAP'ın katkıda bulunduğu Memory Analyzer projesine bakın .

Yapabileceğiniz şeylerden bazıları, bellek sızıntılarını vb. Bulmak için akıl almaz derecede iyidir - bellek içi nesnelere karşı sınırlı bir SQL (OQL) biçimi çalıştırmak da dahil olmak üzere, yani

Com.yourcompany.somepackage.User konumundan SELECT toString (firstName)

Tamamen mükemmel.


18
Eclipse Memory Analyzer'a +100 eklemek istiyorum. Şu anda bir 400mb + yığın dökümü dosyası elemek için çalışıyorum ve tam bir JVM çökmesine neden önce, dosyayı okumak için 70 dakikadan fazla jhat aldı. EMA <5 dakika içinde açabilir.
matt b

3
Eclipse Memory Analyzer'ı kullanarak (aslında Eclipse tarafından da atıldı!) HPROF dosyalarını açarken hatalar ayrıştırma işlemine devam ediyorum. Talihsiz .. iç çek.
lost_bits1110

3
MAT hala biraz RAM gerektirebilir [JHAT'tan daha az ama yine de biraz]. Bu durumla karşılaşırsanız ipuçları için stackoverflow.com/questions/7254017/… adresine bakın.
rogerdpack

71

JDK ile varsayılan olarak sağlanan Java Yığın Analizi Aracı JHAT'ı kullanabilirsiniz . Komut satırıdır, ancak belleği incelemek için kullandığınız bir web sunucusunu / tarayıcıyı başlatır. En kullanıcı dostu değil, ama en azından gittiğiniz çoğu yere zaten yüklü. Çok kullanışlı bir görünüm, en alttaki "yığın histogramı" bağlantısıdır.

örn: jhat -port 7401 -J-Xmx4G dump.hprof

jhat OQL'i "bugünlerde" de yürütebilir (alt bağlantı "OQL'i yürüt")


7401. açılır bu adresten sonra:: Terminal Liman "sunucu hazır" int konsolunda komuta yukarıdaki çalıştırdıktan sonra mesajı alacak localhost: 7401 "tarayıcı pencerelerinde ayrıntılarını görebilirsiniz".
Laxman G

35

Ayrıca kullanabilirsiniz HeapWalker NetBeans Profiler veya gelen Görsel VM bağımsız bir araç. Visual VM, JHAT'a tek başına olduğu için iyi bir alternatiftir, ancak kullanımı JHAT'den çok daha kolaydır.

Visual VM'yi tam olarak kullanabilmek için Java 6+ gereklidir.


Bunun yalnızca Java 6 ve 7 için olduğunu unutmayın.
Nick Stinemates

AFAIK, HeapWalker ve VisualVM, HPROF dosyalarını okumak için Java 6/7 gerektirmez.
James Schek

Sadece Java 5 ile yüklemeye çalıştım ve 'Lütfen Java 6 veya 7 kullanın' dedi. Ne yapıyorum?
Nick Stinemates

Hmm. Belki de Java 6 çalıştırmanız gerekir, ancak bir Java 5 HPROF'u okuyabilirsiniz (belki de bu şekilde çalıştım). Java 5 çalıştıran bir uygulamada Visual VM'den bir yığın dökümü oluşturamayacağınızı biliyorum.
James Schek

Ayrıca java SDK, görsel JVM kullanabilirsiniz - göz için jvisualvm.exede JAVASDK/binklasörünün
xxxvodnikxxx

11

Eclipse Memory Analyzer'ı edinin . Orada daha iyi bir şey yok ve ücretsiz.

JHAT sadece "oyuncak uygulamaları" için kullanılabilir


3
JHAT, LILO'dan başlayarak bir BSD dağıtımı elde eden "l33t" bilgisayar korsanlarını etkilemek için gereklidir. Bekle ... asla java kullanmazlar. :-)
James Schek

Bence bu daha çok bir yorum ...: \
rogerdpack

10

YourKit Java Profiler bunları da ele alıyor gibi görünüyor.


5

Heapdump'ınızın özel bir analizini yapmak istiyorsanız:

Bu kütüphane hızlıdır, ancak analiz kodunuzu Java'ya yazmanız gerekecektir.

Dokümanlardan:

  • Öbek dökümü işlemek için disk üzerinde geçici dosyalar oluşturmaz
  • Doğrudan GZ sıkıştırılmış yığın dökümlerini çalışabilir
  • HeapPath gösterimi

2

Ben şahsen VisualVM'yi tercih ediyorum. VisualVM'de beğendiğim özelliklerden biri de yığın dökümü karşılaştırması. Bir yığın dökümü analizi yaparken, çökmeye neyin neden olduğunu bulmak için gitmek için çeşitli yollar vardır. Yararlı bulduğum yollardan biri, sağlıklı ve sağlıksız yığın dökümü karşılaştırması yapmak.

Bunun için izleyebileceğiniz adımlar şunlardır:

  1. OutOfMemoryError'ın yığın dökümünü almak "oome.hprof" diyelim. Bunu HVDumpOnOutOfMemoryError JVM parametresi ile alabilirsiniz.
  2. Uygulamayı yeniden başlatın, uygulamanıza bağlı olarak büyük bir süre (dakika / saat) çalışmasına izin verin. Uygulama devam ederken başka bir yığın dökümü alın. Buna "healthy.hprof" diyelim.
  3. Bu dökümü VisualVM'de açabilir ve bir yığın dökümü karşılaştırması yapabilirsiniz. Sınıf veya paket düzeyinde yapabilirsiniz. Bu genellikle sizi sorunun yönüne yönlendirebilir.

bağlantı: https://visualvm.github.io

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.