2016-09-21 16 views
10

Yapıyor Garip bir bellek sızıntısı sorunu giderir. Java8'e özgü, 7u79'da olmayacak.Java bellek sızıntısı - jmap sınıfları göstermiyor ama jstat

Java koduna erişimim yok. Ben kullanıcı eylemi ben kaçak sınıfları (değil yığın) ve kusurlu sınıfları ile yapıldığından kolayca tespit edilirken ile ilgili olduğunu biliyorum, bir sızıntısına neden tam olarak biliyoruz ki + TraceClassLoading + TraceClassUnloading:

[Loaded com.mastercard.mcwallet.sdk.xml.allservices.ShoppingCartRequest$JaxbAccessorF_oAuthToken from __JVM_DefineClass__] 
[Loaded com.mastercard.mcwallet.sdk.... thousand similar classes per one user action... ] 

Bu sınıflar artış görünüyor jstat -class tarafından sınıf sayaç çıkışı:

Loaded Bytes Unloaded Bytes  Time 
14045 26138.8  0  0.0  110.00 << buggy user action 
14675 26754.6  0  0.0  110.05 
15300 27364.9  0  0.0  110.10 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 << buggy user action 
15930 27982.2  0  0.0  110.18 
16553 28589.3  0  0.0  110.23 
16553 28589.3  0  0.0  110.23 

şey bu sınıflar asla çöp toplama işlemine [Unloaded], metaspace gelen asla ve onlar jmap -clstats gösterme kalmamasıdır.

class_loader classes bytes parent_loader alive? type 

<bootstrap>  2574 4493256 null   live <internal> 
0x0000000087d016d0  1  1471 0x000000008237f088  dead sun/reflect/[email protected] 
... some lines omitted ... 
0x000000008237f088  6505 12228227  0x0000000080383938  dead org/apache/catalina/loader/[email protected] 
... some lines omitted ... 
total = 600  14002 25351427   N/A   alive=1, dead=599   N/A 

Ben programcılar için geçebileceği bu halkayı herhangi zili mu yoksa herhangi bir ipucu getiriyor: sınıflarının daha az sayıda, sayı artmaz komut raporları, şüpheli bir sınıf yükleyiciler vardır? Sızıntıyı bulamıyorlar diyorlar. JVM seçenekleriyle uğraşarak bu sızıntıyı durdurabilir miyim?

+0

Yalnızca "MetaSpace" ile ilgili sorun mu var? Peki ya "yığın"? ve "Java" işlem belleği kullanım istatistiklerini de sağlayabilir misiniz? –

+0

Sadece Metaspace, yığın sabit ve dolu değil. Tam olarak ne istatistik? – kubanczyk

+0

Java işlem belleği kullanımı ne kadar hızlı büyüyor? –

cevap

2

JaxB'nin, toplanan çöpler olmadan belleğinize sınıflar yüklediğini varsayarım. Sınıflar boşaltılmamışsa, metaspace boş bırakılmaz.

JaxB memory issue for Java 8 için kontrol edin. Bağımlılık api sürümünü değiştirerek veya ek bir parametre üzerinde geçiş yaparak bu özel durumdan kurtulabileceğinizi düşünüyorum:

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 
6

Buggy sınıfları boşaltma için kullanılamıyorsa, uygulamada bir yerde önbelleğe alınmalı ve amacınızın nerede olduğunu bulmak ve geliştiriciler için bu bilgiyi sağlamak olduğunu anlıyorum.

Yığın dökümünüzü incelemek için Eclipse Memory Analyzer'ı (MAT) kullanmayı deneyebilirsiniz ve sorunlu alanları, sınıfları ve buggy sınıflarına bağlantıları olan örnekleri gösterebilir.